Matplotlib 2.2 中的新功能 (2018 年 3 月 6 日)#

约束布局管理器#

警告

约束布局 (Constrained Layout) 仍处于实验阶段。其行为和 API 可能会有所更改,或者整个功能可能会在没有废弃期的情况下被移除。

已添加一种新方法,用于自动决定子图及其组织 GridSpec 实例之间的间距。它旨在取代传统的 tight_layout 方法。通过向 Figuresubplots 传递新的 constrained_layout=True kwarg 来调用它。

此包中新增了 rcParams,并且可以使用新的 set_constrained_layout_pads 更精细地调整间距。

功能包括

  • 子图的自动间距,其中子图及其所有装饰器周围有固定大小的英寸填充,子图之间的空间是子图大小的一部分。

  • suptitle 和附属于多个坐标轴的色条的间距。

  • 使用 GridSpecFromSubplotSpec 的嵌套 GridSpec 布局。

有关更多详细信息和功能,请参阅新教程:约束布局指南

请注意访问此功能的新 API

新的 plt.figureplt.subplots kwarg:constrained_layout#

figure()subplots() 现在可以与 constrained_layout=True kwarg 一起调用,以启用约束布局。

新的 ax.set_position 行为#

Axes.set_position 现在使指定的轴不再响应 constrained_layout,这与用户想要手动放置轴的想法一致。

在内部,这意味着库内部的旧 ax.set_position 调用已更改为私有 ax._set_position 调用,以便 constrained_layout 仍可与这些轴一起工作。

GridSpec 的新 figure kwarg#

为了方便 constrained_layoutGridSpec 现在接受 figure 关键字。这是向后兼容的,因为不提供此关键字将导致 constrained_layout 不在此 GridSpec 实例组织的子图上操作。使用 GridSpec 的例程(例如 fig.subplots)已修改为将图形传递给 GridSpec

xlabel 和 ylabel 现在可以自动对齐#

如果刻度标签宽度差异很大,子图轴的 ylabels 可能会水平错位。如果一个子图上的刻度标签旋转了(例如),xlabels 也会发生同样的情况。Figure 类上的新方法:Figure.align_xlabelsFigure.align_ylabels 现在将水平或垂直对齐这些标签。如果用户只想对齐某些轴,可以传递轴列表。如果没有传递列表,算法会查看图形上的所有标签。

只有具有相同子图位置的标签才会对齐。即,仅当子图位于子图布局的同一列时,ylabels 才对齐。

调用这些方法后,对齐是持久且自动的。

便利包装器 Figure.align_labels 同时调用这两个函数。

(源代码, 2x.png, png)

轴图例现在包含在 tight_bbox 中#

通过 ax.legend 创建的图例有时会超出轴的限制。fig.tight_layout()fig.savefig(bbox_inches='tight') 等工具会裁剪这些图例。现在已进行更改,将它们包含在 tight 计算中。

Cividis 色图#

添加了一个名为“cividis”的新的深蓝/黄色色图。像 viridis 一样,cividis 在感知上是均匀的,并且对色盲友好。然而,cividis 更进一步:它不仅可供色盲用户使用,而且对色盲和非色盲用户来说,它看起来应该实际上是相同的。更多详细信息请参阅 Nuñez J、Anderton C 和 Renslow R:“优化色图并考虑色觉缺陷以实现科学数据的准确解释”

(源代码, 2x.png, png)

新的色盲友好颜色循环样式#

添加了一种定义颜色循环的新样式 tableau-colorblind10,为色盲友好图提供了另一个选项。此新样式的演示可以在样式表的参考中找到。要加载此颜色循环以代替默认循环

import matplotlib.pyplot as plt
plt.style.use('tableau-colorblind10')

支持 numpy.datetime64#

Matplotlib 长期以来在 matplotlib.dates 中支持 datetime.datetime 日期。我们现在也支持 numpy.datetime64 日期。凡是可以使用 datetime.datetime 的地方,现在都可以使用 numpy.datetime64。例如

time = np.arange('2005-02-01', '2005-02-02', dtype='datetime64[h]')
plt.plot(time)

使用 Pillow 编写动画#

现在可以使用 Pillow 作为动画编写器。目前支持的输出格式是 gif (Pillow>=3.4) 和 webp (Pillow>=5.0)。例如使用如下

from __future__ import division

from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation, PillowWriter

fig, ax = plt.subplots()
line, = plt.plot([0, 1])

def animate(i):
   line.set_ydata([0, i / 20])
   return [line]

anim = FuncAnimation(fig, animate, 20, blit=True)
anim.save("movie.gif", writer=PillowWriter(fps=24))
plt.show()

Slider UI 控件可以吸附到离散值#

滑块 UI 控件可以接受可选参数 valstep。这样做会强制滑块仅采用离散值,从 valmin 开始,以 valstep 大小步长递增到 valmax

如果 closedmax==True,则滑块也将吸附到 valmax

capstylejoinstyle 属性已添加到 Collection#

Collection 类现在具有可自定义的 capstylejoinstyle 属性。这允许用户例如设置误差棒的 capstyle

pad kwarg 已添加到 ax.set_title#

方法 Axes.set_title 现在有一个 pad kwarg,它指定了从轴顶部到绘制标题的距离。pad 的单位是点,默认值是(已存在的)rcParams["axes.titlepad"] 的值(默认值:6.0)。

Matplotlib 中两种颜色的比较#

由于 Matplotlib 中的颜色可以通过多种方式指定,因此添加了 matplotlib.colors.same_color 方法,该方法检查两种 colors 是否相同。

极坐标图的自动缩放吸附到原点#

现在,极坐标图中自动设置限制时,如果自动限制接近零,则径向限制将吸附到零。这意味着从零开始绘图不会自动缩放以在径向轴上包含小的负值。

仍可使用 set_ylim 以通常方式手动设置限制。

PathLike 支持#

在 Python 3.6+ 上,savefigimsaveimread 和动画编写器现在接受 os.PathLike 作为输入。

Axes.tick_params 可以设置网格线属性#

Tick 对象包含网格线、刻度标记及其标签。Axis.set_tick_paramsAxes.tick_paramspyplot.tick_params 现在具有关键字参数 'grid_color'、'grid_alpha'、'grid_linewidth' 和 'grid_linestyle',用于覆盖 rcParams 中的默认值:'grid.color' 等。

Axes.imshow 将 RGB 值裁剪到有效范围#

Axes.imshow 接收到超出范围的 RGB 或 RGBA 值时,它现在会记录警告并将其裁剪到有效范围。旧的行为,即包装回范围中,经常会隐藏异常值并使 RGB 图像的解释不可靠。

matplotlibrc 中用于放置 x 轴和 y 轴刻度标签的属性#

matplotlibrc 中引入了四个新的布尔属性,用于 x 轴和 y 轴刻度标签的默认位置,它们是 rcParams["xtick.labeltop"](默认值:False)、rcParams["xtick.labelbottom"](默认值:True)、rcParams["ytick.labelright"](默认值:False)和 rcParams["ytick.labelleft"](默认值:True)。这些也可以在 rcParams 中更改。

gtk3 的 PGI 绑定#

GTK3 后端现在可以使用 PGI 而不是 PyGObject。PGI 是一个相当不完整的 GObject 绑定,因此不建议使用;其主要优点是它在 Travis 上可用(从而允许对 gtk3agg 和 gtk3cairo 后端进行 CI 测试)。

绑定选择规则如下: - 如果 gi 已经导入,则使用它;否则 - 如果 pgi 已经导入,则使用它;否则 - 如果 gi 可以导入,则使用它;否则 - 如果 pgi 可以导入,则使用它;否则 - 报错。

因此,要在同时安装两个绑定时强制使用 PGI,请先导入它。

Qt、WX 和 Tk 画布的 Cairo 渲染#

新的 Qt4CairoQt5CairoWXCairoTkCairo 后端允许 Qt、Wx 和 Tk 画布使用 Cairo 渲染而不是 Agg。

新 ToolManager 中增加了对 QT 的支持#

现在可以使用 ToolManager 和 Qt5 了。例如

import matplotlib

matplotlib.use('QT5AGG')
matplotlib.rcParams['toolbar'] = 'toolmanager'
import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.show()

目前将新的工具类视为实验性,API 可能会发生变化,rcParams 也可能发生变化

主要示例 工具管理器 显示了更多详细信息,只需调整标题以使用 QT 而不是 GTK3

TkAgg 后端重构以支持 PyPy#

PyPy 现在可以使用 TkAgg 后端进行绘图,支持 PyPy 5.9 及更高版本(包括用于 python 2.7 的 PyPy 和用于 python 3.5 的 PyPy)。

Python logging 库用于调试输出#

Matplotlib 过去(零星地)使用内部详细输出报告器。此版本将这些调用转换为使用标准的 Python logging 库。

对旧 rcParams verbose.levelverbose.fileo 的支持已取消。

命令行选项 --verbose-helpful--verbose-debug 仍被接受,但已弃用。它们现在等同于设置 logging.INFOlogging.DEBUG

记录器的根名称是 matplotlib,可以从程序中访问,如下所示

import logging
mlog = logging.getLogger('matplotlib')

基本使用说明在 故障排除 中,开发者说明在 贡献指南 中。

改进的 Transformrepr#

Transformrepr 现在以更易读的方式缩进

In [1]: l, = plt.plot([]); l.get_transform()
Out[1]:
CompositeGenericTransform(
   TransformWrapper(
      BlendedAffine2D(
            IdentityTransform(),
            IdentityTransform())),
   CompositeGenericTransform(
      BboxTransformFrom(
            TransformedBbox(
               Bbox(x0=-0.05500000000000001, y0=-0.05500000000000001, x1=0.05500000000000001, y1=0.05500000000000001),
               TransformWrapper(
                  BlendedAffine2D(
                        IdentityTransform(),
                        IdentityTransform())))),
      BboxTransformTo(
            TransformedBbox(
               Bbox(x0=0.125, y0=0.10999999999999999, x1=0.9, y1=0.88),
               BboxTransformTo(
                  TransformedBbox(
                        Bbox(x0=0.0, y0=0.0, x1=6.4, y1=4.8),
                        Affine2D(
                           [[ 100.    0.    0.]
                           [   0.  100.    0.]
                           [   0.    0.    1.]])))))))