Matplotlib 3.0 更新说明(2018年9月18日)#

改进了默认后端选择#

默认后端不再需要在构建过程中设置。取而代之的是,在运行时,系统会依次尝试内置后端,直到其中一个导入成功为止。

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

循环色彩映射表#

新增了名为 'twilight' 和 'twilight_shifted' 的两个色彩映射表。这些色彩映射表的起点和终点颜色相同,并且拥有两个亮度相等但颜色发散的对称半部分。由于它们是循环的,因此对于相位角、指南针方向或一天中的时间等循环数据来说是一个不错的选择。与 viridiscividis 一样,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)

为 mpl_toolkits 添加 AnchoredDirectionArrows 功能#

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

为 colorbar 添加 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 设置对象现在支持使用 Line2D 对象属性 markevery 的 cyclers 来配置 rcParams["axes.prop_cycle"](默认:cycler('color', [...]))。

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") 将坐标轴的纵横比设置为自动。

SubplotBase 中添加 ax.get_gridspec#

添加了新方法 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 方法#

Figure 类中添加了一个方法 add_artist,允许将艺术家(artists)直接添加到图形中。例如:

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:)均可使用。