Matplotlib 2.2 的新特性 (2018年3月6日)#
约束布局管理器#
警告
约束布局是 实验性的。其行为和API可能会发生变化,或者整个功能可能会在没有弃用期的情况下被移除。
新增了一种自动决定子图间距及其组织 GridSpec 实例的方法。它旨在替代传统的 tight_layout 方法。通过向 Figure 或 subplots 传递新的 constrained_layout=True kwarg 来调用。
这个包有新的 rcParams,并且可以使用新的 set_constrained_layout_pads 更精细地调整间距。
功能包括:
子图的自动间距,以固定英寸大小在子图及其所有装饰器周围填充,并在子图之间以子图大小的分数为单位设置间距。
为
suptitle设置间距,以及附加到多个轴的颜色条。使用
GridSpecFromSubplotSpec的嵌套GridSpec布局。
更多详情和功能请参阅新教程:约束布局指南
注意新的API来访问这个:
新的 plt.figure 和 plt.subplots 关键字参数:constrained_layout#
figure() 和 subplots() 现在可以通过 constrained_layout=True kwarg 来启用 constrained_layout。
新的 ax.set_position 行为#
Axes.set_position 现在使指定的轴不再响应 constrained_layout,这与用户想要手动放置轴的想法一致。
在内部,这意味着库中的旧 ax.set_position 调用被更改为私有 ax._set_position 调用,以便 constrained_layout 仍然可以与这些轴一起工作。
GridSpec 的新 figure 关键字参数#
为了便于 constrained_layout 的使用,GridSpec 现在接受一个 figure 关键字。这是向后兼容的,如果不提供这个关键字,将导致 constrained_layout 不会对由这个 GridSpec 实例组织的子图进行操作。使用 GridSpec 的例程(例如 fig.subplots)已被修改为将图形传递给 GridSpec。
xlabels 和 ylabels 现在可以自动对齐#
如果刻度标签的宽度非常不同,子图轴 ylabels 可能会在水平方向上未对齐。如果一个子图上的刻度标签旋转了(例如),xlabels 也可能发生同样的情况。Figure 类上的新方法:Figure.align_xlabels 和 Figure.align_ylabels 现在将水平或垂直对齐这些标签。如果用户只想对齐某些轴,可以传递一个轴列表。如果没有传递列表,算法会查看图上的所有标签。
只有具有相同子图位置的标签才会对齐。即,只有当子图位于子图布局的同一列时,y 标签才会对齐。
调用这些之后,对齐是持久且自动的。
一个方便的包装器 Figure.align_labels 可以同时调用这两个函数。
(Source code, 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, and Renslow R: "优化色图以考虑色觉缺陷,以实现对科学数据的准确解释"。
(Source code, 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()
滑块 UI 小部件可以捕捉到离散值#
滑块 UI 小部件可以接受可选参数 valstep。这样做会强制滑块仅采用离散值,从 valmin 开始,并以 valstep 的大小步进至 valmax。
如果 closedmax==True,那么滑块也会吸附到 valmax。
capstyle 和 joinstyle 属性已添加到 Collection#
.Collection 类现在具有可自定义的 capstyle 和 joinstyle 属性。这允许用户例如设置误差线的 capstyle。
pad 参数已添加到 ax.set_title#
方法 Axes.set_title 现在有一个 pad 关键字参数,用于指定从轴的顶部到绘制标题处的距离。pad 的单位是点,默认值是(已经存在的):rc:axes.titlepad 的值。
Matplotlib 中两种颜色的比较#
由于在 Matplotlib 中可以通过多种方式指定颜色,因此添加了 matplotlib.colors.same_color 方法,用于检查两个 colors 是否相同。
自动缩放极坐标图会吸附到原点#
在极坐标图中自动设置限制时,如果自动限制接近零,则会将径向限制固定为零。这意味着从零开始绘图不会自动缩放到包括径向轴上的小负值。
仍然可以使用 set_ylim 以通常的方式手动设置限制。
PathLike 支持#
在 Python 3.6+ 中,savefig、imsave、imread 和动画写入器现在接受 os.PathLike 作为输入。
Axes.tick_params 可以设置网格线属性#
Tick 对象保存网格线以及刻度线和其标签。Axis.set_tick_params、Axes.tick_params 和 pyplot.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"] (default: False)、rcParams["xtick.labelbottom"] (default: True)、rcParams["ytick.labelright"] (default: False) 和 rcParams["ytick.labelleft"] (default: True)。这些属性也可以在 rcParams 中更改。
gtk3 的 PGI 绑定#
GTK3 后端现在可以使用 PGI 而不是 PyGObject。PGI 是 GObject 的一个相当不完整的绑定,因此不推荐使用;它的主要好处是可以在 Travis 上使用(从而允许对 gtk3agg 和 gtk3cairo 后端进行 CI 测试)。
绑定选择规则如下:- 如果 gi 已经被导入,使用它;否则 - 如果 pgi 已经被导入,使用它;否则 - 如果 gi 可以被导入,使用它;否则 - 如果 pgi 可以被导入,使用它;否则 - 报错。
因此,为了在使用两个绑定都安装的情况下强制使用 PGI,请首先导入它。
用于 Qt、WX 和 Tk 画布的 Cairo 渲染#
新的 Qt4Cairo、Qt5Cairo、WXCairo 和 TkCairo 后端允许 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可能会发生变化,rcParam也可能会有所改变。
主要示例 工具管理器 展示了更多细节,只需调整标题以使用 QT 而不是 GTK3
TkAgg 后端经过重构以支持 PyPy#
PyPy 现在可以使用 TkAgg 后端进行绘图,支持 PyPy 5.9 及以上版本(包括适用于 Python 2.7 和 Python 3.5 的 PyPy)。
用于调试输出的 Python 日志库#
Matplotlib 过去(偶尔)使用了一个内部的详细输出报告器。这个版本将这些调用转换为使用标准的 Python logging 库。
不再支持旧的 rcParams verbose.level 和 verbose.fileo。
命令行选项 --verbose-helpful 和 --verbose-debug 仍然被接受,但已弃用。它们现在等同于设置 logging.INFO 和 logging.DEBUG。
记录器的根名称是 matplotlib ,可以从程序中访问为:
import logging
mlog = logging.getLogger('matplotlib')
改进了 Transform 的 repr#
Transforms 现在以更易读的方式缩进其 reprs:
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.]])))))))