Matplotlib 3.5.0 的新特性 (2021年11月15日)#
有关自上次修订以来的所有问题和拉取请求的列表,请参阅 GitHub 统计数据为 3.9.2 版本(2024年8月12日)。
图形和轴的创建/管理#
subplot_mosaic 支持简单的 Axes 共享#
Figure.subplot_mosaic, pyplot.subplot_mosaic 支持 简单 的 Axes 共享(即,只能传递 True/False 给 sharex/sharey)。当 True 时,刻度标签可见性和轴单位将被共享。
mosaic = [
['A', [['B', 'C'],
['D', 'E']]],
['F', 'G'],
]
fig = plt.figure(constrained_layout=True)
ax_dict = fig.subplot_mosaic(mosaic, sharex=True, sharey=True)
# All Axes use these scales after this call.
ax_dict['A'].set(xscale='log', yscale='logit')
(Source code, 2x.png, png)
Figure 现在有 draw_without_rendering 方法#
图形的某些方面只有在绘制时才能确定,例如文本艺术家的确切位置或像自动数据限制这样的延迟计算。如果你需要这些值,可以使用 figure.canvas.draw() 强制进行完整绘制。然而,这会有副作用,有时需要一个打开的文件,并且做的比所需的工作更多。
新的 Figure.draw_without_rendering 方法执行了 draw() 所做的所有更新,但跳过了渲染图形。因此,如果你需要更新后的值来进一步配置图形的其他方面,这种方法更为高效。
图 __init__ 通过关键字参数进行设置#
与 Artist 的许多其他子类类似,FigureBase、SubFigure 和 Figure 类现在会将任何额外的关键字参数传递给 set,以允许在新创建的对象初始化时设置其属性。例如:
from matplotlib.figure import Figure
fig = Figure(label='my figure')
绘图方法#
添加 Annulus 补丁#
Annulus 是一个用于绘制椭圆环的新类。
(Source code, 2x.png, png)
FancyArrow 补丁的 set_data 方法#
FancyArrow,由 ax.arrow 返回的补丁,现在有一个 set_data 方法,允许在创建后修改箭头,例如用于动画。
ArrowStyle 和 ConnectionPatch 中的新箭头样式#
ArrowStyle 的新 arrow 参数替代了在创建箭头时使用 beginarrow 和 endarrow 参数。它接收诸如 '<-'、']-[' 和 ']->' 的箭头字符串,而不是单独的布尔值。
通过此机制,还添加了两种新样式 ']->' 和 '<-['。ConnectionPatch 通过其 arrowstyle 参数接受箭头样式,也接受这些新样式。
(Source code, 2x.png, png)
在初始化后设置集合偏移变换#
添加的 collections.Collection.set_offset_transform 可以在初始化后用于设置偏移变换。这在创建一个 collections.Collection 对象时非常有用,该对象在 Axes 对象外部创建,然后通过 Axes.add_collection() 添加,并将偏移变换设置为 Axes.transData。
颜色和颜色映射#
颜色映射注册表(实验性)#
颜色映射现在通过 matplotlib.colormaps`(或 `.pyplot.colormaps)进行管理,这是一个 ColormapRegistry。虽然我们有信心该 API 是最终版本,但我们正式将其标记为 3.5 版本的实验性功能,因为我们希望保留在需要时为 3.6 版本修改 API 的选项。
可以使用项目访问来获取颜色映射:
import matplotlib.pyplot as plt
cmap = plt.colormaps['viridis']
要注册新的色图,请使用:
plt.colormaps.register(my_colormap)
我们建议在新代码中使用新的API,而不是使用 matplotlib.cm.get_cmap 和 matplotlib.cm.register_cmap 函数。matplotlib.cm.get_cmap 和 matplotlib.cm.register_cmap 最终将被弃用并移除。在 pyplot 中,plt.get_cmap() 和 plt.register_cmap() 将继续支持向后兼容。
现在可以在 RGBA 阶段进行图像插值#
通过 imshow 在 Matplotlib 中创建的图像会被重新采样以匹配当前画布的分辨率。在降采样时应用自动抗锯齿滤波器以减少摩尔纹效应是有用的。默认情况下,数据会进行插值处理,应用标准化,然后执行颜色映射。
然而,通常希望抗锯齿插值在 RGBA 空间中进行,其中颜色是插值的而不是数据。这通常会导致颜色超出色图范围,但视觉上混合了相邻颜色,这也是浏览器和其他图像处理软件的做法。
为 imshow 提供了一个新的关键字参数 interpolation_stage,用于设置抗锯齿插值发生的阶段。默认值为当前的“data”行为,另一种选择是“rgba”,用于新提供的功能。
插值阶段选项的示例。#
更多详情请参见 图像重采样 中关于新关键字参数的讨论。
imshow 支持半精度浮点数数组#
imshow 方法现在支持半浮点数组,即 dtype 为 np.float16 的 NumPy 数组。
回调注册表已添加到 Normalize 对象中#
colors.Normalize 对象现在有一个回调注册表,callbacks,其他对象可以通过它连接以在规范更新时收到通知。当规范被修改时,回调会发出键 changed。cm.ScalarMappable 现在是一个监听器,当规范的 vmin、vmax 或其他属性改变时,它将注册一个变化。
标题、刻度和标签#
在 set_ticks 中同时设置刻度位置和标签#
Axis.set_ticks (以及相应的 Axes.set_xticks / Axes.set_yticks) 新增了一个 labels 参数,允许同时设置刻度位置和标签。
之前,设置刻度标签是通过使用 Axis.set_ticklabels`(或相应的 `.Axes.set_xticklabels / Axes.set_yticklabels)来完成的;这通常只有在刻度位置之前通过 set_ticks 固定后才有意义:
ax.set_xticks([1, 2, 3])
ax.set_xticklabels(['a', 'b', 'c'])
组合功能现在可以在 set_ticks 中使用:
ax.set_xticks([1, 2, 3], ['a', 'b', 'c'])
不鼓励使用 Axis.set_ticklabels,但它将保持可用以确保向后兼容性。
注意:这一添加使得 set_ticks 的 API 也更加类似于 pyplot.xticks / pyplot.yticks,它们已经具有额外的 labels 参数。
字体和文本#
三重和四重点数学文本重音#
除了单点和双点重音外,mathtext 现在还支持三重和四重点重音。
fig = plt.figure(figsize=(3, 1))
fig.text(0.5, 0.5, r'$\dot{a} \ddot{b} \dddot{c} \ddddot{d}$', fontsize=40,
horizontalalignment='center', verticalalignment='center')
(Source code, 2x.png, png)
图例标题的字体属性是可配置的#
标题的字体属性可以通过 title_fontproperties 关键字参数设置,例如:
(Source code, 2x.png, png)
Text 和 TextBox 添加了 parse_math 选项#
Text 和 TextBox 对象现在允许一个仅关键字的参数 parse_math,它控制是否应从显示的字符串中解析数学内容。如果为 True,字符串将被解析为数学文本对象。如果为 False,字符串将被视为字面量,不会进行解析。
文本可以定位在 TextBox 小部件内#
一个新的参数 textalignment 可以用来控制 TextBox 小部件中 Axes 内文本的位置。
(Source code, 2x.png, png)
简化 usetex 模式的字体设置#
现在 rcParams["font.family"] (default: ['sans-serif']) 接受一些字体名称作为值,以便更用户友好的设置。
plt.rcParams.update({
"text.usetex": True,
"font.family": "Helvetica"
})
类型 42 子集化现在已为 PDF/PS 后端启用#
backend_pdf 和 backend_ps 现在使用了一个统一的 Type 42 字体子集接口,这在 fontTools 的帮助下实现。
将 rcParams["pdf.fonttype"] (default: 3) 或 rcParams["ps.fonttype"] (default: 3) 设置为 42 以触发此工作流程:
# for PDF backend
plt.rcParams['pdf.fonttype'] = 42
# for PS backend
plt.rcParams['ps.fonttype'] = 42
fig, ax = plt.subplots()
ax.text(0.4, 0.5, 'subsetted document is smaller in size!')
fig.savefig("document.pdf")
fig.savefig("document.ps")
rcParams 改进#
允许全局设置默认图例标签颜色#
一个新的 rcParams["legend.labelcolor"] (default: 'None') 设置了 Figure.legend 的默认 labelcolor 参数。特殊值 'linecolor'、'markerfacecolor'(或 'mfc')或 'markeredgecolor'(或 'mec')将使图例文本与标记的相应颜色匹配。
(Source code, 2x.png, png)
3D 轴改进#
Axes3D 现在允许手动控制绘制顺序#
Axes3D 类现在有了 computed_zorder 参数。当设置为 False 时,Artists 使用它们的 zorder 属性进行绘制。
(Source code, 2x.png, png)
允许在3D图中更改垂直轴#
view_init 现在有了参数 vertical_axis,它允许切换哪个轴是垂直对齐的。
(Source code, 2x.png, png)
plot_surface 支持掩码数组和 NaN#
axes3d.Axes3D.plot_surface 支持掩码数组和 NaN,现在将隐藏包含掩码或 NaN 点的四边形。其行为类似于 Axes.contour 在 corner_mask=True 时的行为。
(Source code, 2x.png, png)
3D 绘图方法支持 数据 关键字参数#
为了匹配所有二维绘图方法,三维坐标轴现在支持 data 关键字参数。这允许从类似 DataFrame 的结构间接传递参数。:
data = { # A labelled data set, or e.g., Pandas DataFrame.
'x': ...,
'y': ...,
'z': ...,
'width': ...,
'depth': ...,
'top': ...,
}
fig, ax = plt.subplots(subplot_kw={'projection': '3d')
ax.bar3d('x', 'y', 'z', 'width', 'depth', 'top', data=data)
交互工具改进#
颜色条现在具有平移和缩放功能#
带有颜色条的交互式图表现在可以在颜色条轴上进行缩放和平移。这将调整与颜色条关联的 ScalarMappable 的 vmin 和 vmax。目前这仅对连续范数启用。与 contourf 和分类一起使用的范数,如 BoundaryNorm 和 NoNorm,默认情况下禁用了交互功能。可以使用 cb.ax.set_navigate() 来设置颜色条轴是否为交互式的。
更新了滑块小部件的外观#
Slider 和 RangeSlider 小部件的外观已更新,并为新增的把手提供了新的样式参数。
(Source code, 2x.png, png)
在 PolygonSelector 上移除点#
完成 PolygonSelector 后,现在可以通过右键点击来移除单个点。
拖动选择器#
SpanSelector、RectangleSelector 和 EllipseSelector 有一个新的关键字参数 drag_from_anywhere,当设置为 True 时,允许你从选择器内的任何位置点击并拖动来移动它。以前只能通过激活移动修饰按钮或点击中心手柄来移动它。
现在可以使用边缘手柄来改变 SpanSelector 的大小。
清除选择器#
选择器(EllipseSelector、LassoSelector、PolygonSelector、RectangleSelector 和 SpanSelector)有一个新方法 clear,它将清除当前选择并使选择器准备好进行新的选择。这相当于按下 escape 键。
设置选择器的艺术家属性#
EllipseSelector、LassoSelector、PolygonSelector、RectangleSelector 和 SpanSelector 选择器的艺术家属性可以通过 set_props 和 set_handle_props 方法进行更改。
忽略选择范围外的事件#
EllipseSelector, RectangleSelector 和 SpanSelector 选择器有一个新的关键字参数 ignore_event_outside,当设置为 True 时,将忽略当前选择区域外的事件。可以使用手柄或新的拖动功能来更改选择。
CallbackRegistry 对象获得了一个临时阻止信号的方法#
上下文管理器 blocked 可以用来阻止回调信号被 CallbackRegistry 处理。可选的关键字 signal 可以用来阻止特定信号的处理,并让所有其他信号通过。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.imshow([[0, 1], [2, 3]])
# Block all interactivity through the canvas callbacks
with fig.canvas.callbacks.blocked():
plt.show()
fig, ax = plt.subplots()
ax.imshow([[0, 1], [2, 3]])
# Only block key press events
with fig.canvas.callbacks.blocked(signal="key_press_event"):
plt.show()
方向性尺寸调整光标#
画布现在支持设置方向性调整大小的光标,即水平和垂直的双箭头。这些光标用于例如选择器小部件中。尝试 鼠标光标 示例以查看您所需后端中的光标。
Sphinx 扩展#
更多 mathmpl sphinx 扩展的配置#
matplotlib.sphinxext.mathmpl sphinx 扩展支持两个新的配置选项,可以在您的 conf.py 中指定:
mathmpl_fontsize(浮点数),用于设置数学文本的字体大小,单位为点;mathmpl_srcset(str 列表),它提供了一个尺寸列表来支持 响应式分辨率图像 列表应包含额外的 x-描述符 ('1.5x','2x', 等) 以生成 (1x 是默认值,总是包含在内。)
特定后端的改进#
GTK 后端#
已添加支持 GTK4 的后端。支持 Agg 和 Cairo 渲染器。GTK4 后端可以选择为 GTK4Agg 或 GTK4Cairo。
Qt 后端#
已添加对 Qt6 的支持(使用 PyQt6 或 PySide6),可选择 Agg 或 Cairo 渲染器。同时,已移除对 Qt4 的支持。Qt6 和 Qt5 均由一个组合后端(QtAgg 或 QtCairo)支持,加载的版本由已导入的模块、QT_API 环境变量和可用包决定。详情请参阅 Qt 绑定。为了向后兼容,版本化的 Qt5 后端名称(Qt5Agg 或 Qt5Cairo)仍然受支持。
基于Cairo、GTK 和 Tk 后端的 HiDPI 支持#
GTK3 后端现在完全支持 HiDPI,包括混合显示器的情况(仅限 Wayland)。新添加的 GTK4 后端也支持 HiDPI。
TkAgg 后端现在仅在 Windows 上支持 HiDPI ,包括混合显示器的情况。
所有基于Cairo的后端都正确支持HiDPI,就像它们的Agg对应部分一样(即,如果工具包支持HiDPI,那么*Cairo后端现在也将支持它,否则则不支持。)
Qt 图形选项编辑器改进#
在Qt后端的图形选项编辑器现在也支持编辑左右标题(加上现有的中心标题)。在使用日期转换器时,编辑轴限制的支持更好。symlog 选项现在在轴缩放选项中可用。所有具有相同标签的条目现在都显示在曲线选项卡中。
WebAgg 使用 asyncio 而不是 Tornado#
WebAgg 后端默认使用 asyncio 通过 Tornado 进行计时器支持。这使得在 JupyterLite 中可以使用 WebAgg 后端。
版本信息#
我们切换到了 release-branch-semver 版本的 setuptools-scm 版本方案。这仅影响开发构建的版本信息。它们的版本号现在描述了目标发布版本,即 3.5.0.dev820+g6768ef8c4c 表示在上一个发布版本之后有 820 次提交,并计划稍后正式发布为 3.5.0。
除了字符串 __version__ 之外,现在还有一个命名元组 __version_info__,它是模仿 sys.version_info 设计的。它的主要用途是安全地比较版本信息,例如 if __version_info__ >= (3, 4, 2)。