Matplotlib 2.2 中的新功能 (2018 年 3 月 6 日)#
约束布局管理器#
警告
约束布局 (Constrained Layout) 仍处于实验阶段。其行为和 API 可能会有所更改,或者整个功能可能会在没有废弃期的情况下被移除。
已添加一种新方法,用于自动决定子图及其组织 GridSpec
实例之间的间距。它旨在取代传统的 tight_layout
方法。通过向 Figure
或 subplots
传递新的 constrained_layout=True
kwarg 来调用它。
此包中新增了 rcParams
,并且可以使用新的 set_constrained_layout_pads
更精细地调整间距。
功能包括
子图的自动间距,其中子图及其所有装饰器周围有固定大小的英寸填充,子图之间的空间是子图大小的一部分。
suptitle
和附属于多个坐标轴的色条的间距。使用
GridSpecFromSubplotSpec
的嵌套GridSpec
布局。
有关更多详细信息和功能,请参阅新教程:约束布局指南
请注意访问此功能的新 API
新的 plt.figure
和 plt.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_layout
,GridSpec
现在接受 figure
关键字。这是向后兼容的,因为不提供此关键字将导致 constrained_layout
不在此 GridSpec
实例组织的子图上操作。使用 GridSpec
的例程(例如 fig.subplots
)已修改为将图形传递给 GridSpec
。
xlabel 和 ylabel 现在可以自动对齐#
如果刻度标签宽度差异很大,子图轴的 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 和 Renslow R:“优化色图并考虑色觉缺陷以实现科学数据的准确解释”。

新的色盲友好颜色循环样式#
添加了一种定义颜色循环的新样式 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。
capstyle
和 joinstyle
属性已添加到 Collection
#
Collection
类现在具有可自定义的 capstyle
和 joinstyle
属性。这允许用户例如设置误差棒的 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+ 上,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"]
(默认值: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 的支持#
现在可以使用 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.level
和 verbose.fileo
的支持已取消。
命令行选项 --verbose-helpful
和 --verbose-debug
仍被接受,但已弃用。它们现在等同于设置 logging.INFO
和 logging.DEBUG
。
记录器的根名称是 matplotlib
,可以从程序中访问,如下所示
import logging
mlog = logging.getLogger('matplotlib')
改进的 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.]])))))))