Matplotlib 2.2 新特性 (2018年3月6日)#
约束布局管理器 (Constrained Layout Manager)#
警告
约束布局(Constrained Layout)目前为实验性功能。其行为和 API 可能会发生变化,整个功能也可能在没有弃用期的情况下被移除。
新增了一种自动决定子图及其所组织的 GridSpec 实例之间间距的方法。它旨在取代旧有的 tight_layout 方法。可以通过向 Figure 或 subplots 传递新的 constrained_layout=True 关键字参数来调用。
该软件包新增了 rcParams,并且可以通过新的 set_constrained_layout_pads 对间距进行更精细的调整。
功能包括
子图的自动间距调整:在子图及其所有修饰元素周围提供以英寸为单位的固定填充(padding),并在子图之间提供作为子图尺寸一部分的间距。
为
suptitle以及连接到多个坐标轴的颜色条(colorbars)提供间距支持。使用
GridSpecFromSubplotSpec实现嵌套的GridSpec布局。
有关更多详细信息和功能,请参阅新的教程:约束布局指南 (Constrained layout guide)
请注意访问此功能的 API
新增 plt.figure 和 plt.subplots 关键字参数:constrained_layout#
现在调用 figure() 和 subplots() 时可以使用 constrained_layout=True 参数来启用该功能。
新的 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 现在可以将这些标签在水平或垂直方向上对齐。如果用户只想对齐部分坐标轴,可以传递一个坐标轴列表。如果没有传递列表,算法将检查图形上的所有标签。
只有处于相同子图位置的标签才会被对齐。即:只有当子图位于子图布局的同一列时,ylabels 才会对齐。
调用这些方法后,对齐方式是持久且自动的。
便捷封装器 Figure.align_labels 可同时调用这两个函数。
坐标轴图例现已包含在 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: "Optimizing colormaps with consideration for color vision deficiency to enable accurate interpretation of scientific data"。
新的色盲友好型颜色循环样式#
新增了一种名为 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 组件现可捕捉到离散值#
Slider UI 组件现在可以接受可选参数 valstep。这会强制滑块仅取离散值,从 valmin 开始,以 valstep 为步长增加到 valmax。
如果 closedmax==True,滑块也会捕捉到 valmax。
为 Collection 添加了 capstyle 和 joinstyle 属性#
Collection 类现在具有可自定义的 capstyle 和 joinstyle 属性。这允许用户例如设置误差线的 capstyle。
为 ax.set_title 添加了 pad 关键字参数#
方法 Axes.set_title 现在有一个 pad 关键字参数,用于指定从坐标轴顶部到绘制标题位置的距离。pad 的单位是点(points),默认值为(已存在的)rcParams["axes.titlepad"] 的值(默认:6.0)。
Matplotlib 中 2 种颜色的比较#
由于 Matplotlib 中指定颜色的方式多种多样,新增了 matplotlib.colors.same_color 方法,用于检查两种 颜色 是否相同。
极坐标图的自动缩放会捕捉到原点#
现在,极坐标图的自动限制设置会将径向限制捕捉到零(如果自动限制值接近零的话)。这意味着从零点绘图时,径向轴不会自动缩放到包含小的负值。
限制仍然可以像往常一样使用 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 中用于放置 xaxis 和 yaxis 刻度标签的属性#
在 matplotlibrc 中引入了四个新的布尔属性,用于设置 xaxis 和 yaxis 刻度标签的默认位置,即: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 渲染#
新的 Qt4Cairo、Qt5Cairo、WXCairo 和 TkCairo 后端允许 Qt、Wx 和 Tk 画布使用 Cairo 渲染而不是 Agg。
在新的 ToolManager 中增加了对 QT 的支持#
现在可以在 Qt5 中使用 ToolManager 了。例如:
import matplotlib
matplotlib.use('QT5AGG')
matplotlib.rcParams['toolbar'] = 'toolmanager'
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.show()
请将新的 Tool 类视为实验性功能,其 API 和 rcParam 可能会发生变化。
主要示例 工具管理器 (Tool Manager) 展示了更多细节,只需调整标题以使用 QT 而不是 GTK3 即可。
TkAgg 后端重构以支持 PyPy#
PyPy 现在可以使用 TkAgg 后端进行绘图,支持 PyPy 5.9 及更高版本(包括 Python 2.7 的 PyPy 和 Python 3.5 的 PyPy)。
Python logging 库用于调试输出#
过去 Matplotlib(零星地)使用了一个内部的详细输出报告器。此版本将这些调用转换为使用标准的 Python logging 库。
对旧版 rcParams verbose.level 和 verbose.fileo 的支持已被放弃。
命令行选项 --verbose-helpful 和 --verbose-debug 仍然被接受,但已被弃用。它们现在等同于设置 logging.INFO 和 logging.DEBUG。
记录器的根名称为 matplotlib,可以在程序中通过以下方式访问:
import logging
mlog = logging.getLogger('matplotlib')
基本使用说明位于 故障排除 (Troubleshooting),开发者指南位于 贡献指南 (Contributing guide)。
改进了 Transform 的 repr#
Transform 现在以更易读的方式缩进它们的 repr。
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.]])))))))