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)

AnchoredDirectionArrows 功能添加到 mpl_toolkits#

一个新的 mpl_toolkits 类 AnchoredDirectionArrows 绘制一对正交箭头以指示二维图上的方向。一个最小的工作示例需要输入坐标系的变换对象(通常是 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"] (default: None)。两者默认值为 None,这意味着图例标题的字体大小将与轴的默认字体大小相同(不是 图例字体大小,由 fontsize 关键字参数或 rcParams["legend.fontsize"] (default: 'medium') 设置)。

支持在rcParams中使用axes.prop_cycle属性 markevery#

Matplotlib 的 rcParams 设置对象现在支持使用 markevery Line2D 对象属性配置 rcParams["axes.prop_cycle"] (default: 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 ,使用户可以轻松获取用于创建轴的网格规格:

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()

坐标轴标题将不再与x轴重叠#

之前,如果x轴与轴标题重叠(通常当x轴位于轴的顶部时),轴标题必须手动移动。现在,如果它们位于顶部,标题将自动移动到x轴及其装饰器(包括x标签)的上方。

如果需要,标题仍然可以手动放置。这里有一个小小的技巧;算法会检查标题的y位置是否为1.0(默认值),如果是,则会移动。如果用户将标题放置在默认位置(即 ax.title.set_position(0.5, 1.0)),标题仍然会被移动到x轴上方。如果用户想要避免这种情况,他们可以指定一个接近的数值(例如 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:)仍然可用。