Matplotlib 3.0 新特性(2018 年 9 月 18 日)#

改进的默认后端选择#

默认后端不再需要在构建过程中设置。相反,在运行时,会依次尝试内置后端,直到其中一个导入成功。

无头 Linux 服务器(通过未定义 DISPLAY 环境变量来识别)不会选择 GUI 后端。

循环颜色映射#

添加了两个新的颜色映射,名为“twilight”和“twilight_shifted”。这些颜色映射的起始和结束颜色相同,并且具有两个对称的半部分,光度相等,但颜色不同。由于它们可以循环,因此它们是循环数据的理想选择,例如相位角、罗盘方向或时间。与 *viridis* 和 *cividis* 一样,*twilight* 在感知上是均匀的,并且对色盲友好。

能够按固定的数量级缩放轴#

要按固定的数量级缩放轴,请将 Axes.ticklabel_formatscilimits 参数设置为相同的(非零)下限和上限。例如,要将 y 轴缩放一百万倍 (1e6),请使用

ax.ticklabel_format(style='sci', scilimits=(6, 6), axis='y')

scilimits=(0, 0) 的行为不变。使用此设置,Matplotlib 将根据轴值调整数量级,而不是保持固定。以前,设置 scilimits=(m, m) 等同于设置 scilimits=(0, 0)

AnchoredDirectionArrows 功能添加到 mpl_toolkits#

一个新的 mpl_toolkits 类 AnchoredDirectionArrows 绘制一对正交箭头,以指示 2D 图上的方向。一个最小工作示例需要坐标系的转换对象(通常是 ax.transAxes)和箭头标签。有几个可选参数可用于更改布局。例如,可以旋转箭头对并更改颜色。默认情况下,标签和箭头的颜色相同,但该类也可以传递参数来自定义箭头和文本布局,这些参数会传递给 matplotlib.textpath.TextPathmatplotlib.patches.FancyArrowPatch。可以调整箭头尾部和头部的定位、长度和宽度,方向箭头和标签可以有边框。可以调整填充和间距参数。

为颜色条添加 minorticks_on()/off() 方法#

已添加新方法 ColorbarBase.minorticks_on 以在颜色条上正确显示次刻度。当 *extend* 关键字参数(在创建颜色条时使用)设置为“both”、“max”或“min”时,此方法不允许次刻度延伸到 vmin 和 vmax 之外的区域。还添加了一个补充方法 ColorbarBase.minorticks_off 以删除颜色条上的次刻度。

颜色条刻度现在可以是自动的#

以前放置在颜色条上的刻度数量适用于大型颜色条,但如果颜色条缩小(即通过 *shrink* 关键字参数)则看起来很糟糕。这已更改,以便刻度数量现在可以响应颜色条的大小。

不要自动重命名重复的文件名#

之前,当使用 GUI 的保存对话框将图形保存到文件时,如果默认文件名(基于图形窗口标题)已存在于磁盘上,Matplotlib 会附加一个后缀(例如 Figure_1-1.png),从而阻止对话框提示是否覆盖该文件。此行为已被移除。现在,如果文件名已存在于磁盘上,则会提示用户是否覆盖该文件。这消除了猜测,并允许有意覆盖,尤其是在使用 figure.canvas.set_window_title() 手动设置图形名称时。

图例现在具有 title_fontsize 关键字参数(和 rcParam)#

Figure.legendAxes.legend 的标题现在可以通过 title_fontsize 关键字参数设置字体大小。还有一个新的 rcParams["legend.title_fontsize"] (默认值: None)。两者都默认为 None,这意味着图例标题将具有与轴默认字体大小相同的字体大小(不是图例字体大小,由 fontsize 关键字参数或 rcParams["legend.fontsize"] (默认值: 'medium')设置)。

rcParams 中支持 axes.prop_cycle 属性 markevery#

Matplotlib rcParams 设置对象现在支持使用 markevery Line2D 对象属性配置 rcParams["axes.prop_cycle"] 属性(默认值:cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf']))的循环器。

pgf 后端支持多页 PDF#

pgf 后端现在也支持多页 PDF 文件。

from matplotlib.backends.backend_pgf import PdfPages
import matplotlib.pyplot as plt

with PdfPages('multipage.pdf') as pdf:
    # page 1
    plt.plot([2, 1, 3])
    pdf.savefig()

    # page 2
    plt.cla()
    plt.plot([3, 1, 2])
    pdf.savefig()

饼图现在默认是圆形的#

我们承认大多数人不喜欢蛋形的饼图。因此,绘制饼图的轴默认设置为具有相等的纵横比。这确保饼图显示为圆形,与轴的大小或单位无关。要恢复到之前的行为,请使用 ax.set_aspect("auto")plt.axis("auto") 将轴的纵横比设置为自动。

ax.get_gridspec 添加到 SubplotBase#

添加了新的方法 SubplotBase.get_gridspec,以便用户可以轻松获取用于创建轴的 gridspec

import matplotlib.pyplot as plt

fig, axs = plt.subplots(3, 2)
gs = axs[0, -1].get_gridspec()

# remove the last column
for ax in axs[:,-1].flatten():
  ax.remove()

# make a subplot in last column that spans rows.
ax = fig.add_subplot(gs[:, -1])
plt.show()

轴标题将不再与 xaxis 重叠#

以前,如果 xaxis 重叠(通常当 xaxis 位于轴的顶部时),则必须手动移动轴标题。现在,如果标题位于顶部,则标题将自动移动到 xaxis 及其修饰符(包括 xlabel)之上。

如果需要,标题仍然可以手动放置。有一个小技巧;该算法会检查标题的 y 位置是否为 1.0(默认值),如果是,则会移动。如果用户将标题放置在默认位置(即 ax.title.set_position(0.5, 1.0)),则标题仍将移动到 xaxis 之上。如果用户想要避免这种情况,他们可以指定一个接近的数字(即 ax.title.set_position(0.5, 1.01)),并且标题不会通过此算法移动。

GridSpec 的新便捷方法#

对于 gridspec.GridSpecgridspec.GridSpecFromSubplotSpec,有新的便捷方法。现在我们可以调用 Figure.add_gridspec 来代替前者,并调用 SubplotSpec.subgridspec 来代替后者。

import matplotlib.pyplot as plt

fig = plt.figure()
gs0 = fig.add_gridspec(3, 1)
ax1 = fig.add_subplot(gs0[0])
ax2 = fig.add_subplot(gs0[1])
gssub = gs0[2].subgridspec(1, 3)
for i in range(3):
    fig.add_subplot(gssub[0, i])

Figure 有一个 add_artist 方法#

已将方法 add_artist 添加到 Figure 类,这允许直接向图形添加艺术家。例如:

circ = plt.Circle((.7, .5), .05)
fig.add_artist(circ)

如果添加的艺术家之前没有设置变换,则会将其设置为图形变换(fig.transFigure)。这种新方法对于向没有轴的图形添加艺术家或在图形坐标中轻松定位静态元素可能很有用。

:math: 指令重命名为 :mathmpl:#

matplotlib.sphinxext.mathmpl 提供的 :math: rst 角色已重命名为 :mathmpl:,以避免与 Sphinx 1.8 默认提供的 :math: 角色冲突。(:mathmpl: 使用 Matplotlib 将数学表达式渲染为嵌入在 html 中的图像,而 Sphinx 使用 MathJax。)

当使用 Sphinx<1.8 时,为了向后兼容,两个名称(:math::mathmpl:)仍然可用。