Matplotlib 3.5.0 中的新功能(2021 年 11 月 15 日)#
有关自上次修订以来的所有问题和 pull request 的列表,请参阅 3.10.0 的 GitHub 统计信息 (2024 年 12 月 13 日) .
Figure 和 Axes 的创建/管理#
subplot_mosaic 支持简单的 Axes 共享#
Figure.subplot_mosaic , pyplot.subplot_mosaic 支持简单的 Axes 共享(即,只能将 True / False 传递给 sharex/sharey).当为 True 时,刻度标签可见性和 Axis 单位将被共享.
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, png)
Figure 现在具有 draw_without_rendering 方法#
图形的某些方面仅在绘制时确定,例如文本艺术家的确切位置或延迟计算(如自动数据限制).如果您需要这些值,可以使用 figure.canvas.draw() 强制进行完整绘制.但是,这会产生副作用,有时需要打开文件,并且会做更多不必要的工作.
新的 Figure.draw_without_rendering 方法运行 draw() 执行的所有更新,但跳过渲染图形.因此,如果您需要更新的值来配置图形的进一步方面,它会更有效率.
Figure __init__ 将关键字参数传递给 set#
与 Artist 的许多其他子类相似, FigureBase , SubFigure 和 Figure 类现在会将任何额外的关键字参数传递给 set ,以允许在初始化时设置新创建对象的属性.例如:
from matplotlib.figure import Figure
fig = Figure(label='my figure')
绘图方法#
添加 Annulus 补丁#
.Annulus 是一个用于绘制椭圆环的新类.
(Source code, png)
FancyArrow 补丁的 set_data 方法#
FancyArrow ,由 ax.arrow 返回的补丁,现在有一个 set_data 方法,允许在创建后修改箭头,例如,用于动画.
ArrowStyle 和 ConnectionPatch 中的新箭头样式#
ArrowStyle 的新的 arrow 参数取代了在箭头创建中使用 beginarrow 和 endarrow 参数.它接收像 '<-' , ']-[ ' 和 '->' ' 这样的箭头字符串,而不是单独的布尔值.
通过这种机制,还添加了两种新样式 '->' 和 '<-[' . ConnectionPatch 接受通过 arrowstyle 参数传递的箭头样式,也接受这些新样式.
(Source code, png)
初始化后设置集合偏移变换#
添加的 collections.Collection.set_offset_transform 可用于在初始化后设置偏移变换.当在 Axes 对象外部创建 collections.Collection ,稍后使用 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 对象添加回调注册表#
Normalize 对象现在有一个回调注册表 callbacks ,其他对象可以连接到该注册表,以便在规范更新时收到通知.当规范被修改时,回调会发出键 changed . cm.ScalarMappable 现在是一个监听器,当规范的 vmin,vmax 或其他属性被改变时,它会注册一个更改.
标题,刻度和标签#
在 set_ticks 中同时设置刻度位置和标签#
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 参数.
字体和文本#
三重和四重点数学文本重音符#
除了单点和双点重音符之外,数学文本现在还支持三重和四重点重音符.
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, png)
图例标题的字体属性可配置#
标题的字体属性可以通过 title_fontproperties 关键字参数设置,例如:
(Source code, png)
Text 和 TextBox 添加了 parse_math 选项#
Text 和 TextBox 对象现在允许一个 parse_math 关键字专用参数,该参数控制是否应从显示的字符串中解析数学公式.如果为 True,则该字符串将被解析为数学文本对象.如果为 False,则该字符串将被视为字面量,并且不会进行解析.
文本可以定位在 TextBox 小部件内部#
一个名为 textalignment 的新参数可用于控制 TextBox 小部件的 Axes 中文本的位置.
(Source code, png)
简化 usetex 模式下的字体设置#
现在 rcParams["font.family"] (default: ['sans-serif']) 接受一些字体名称作为值,以便进行更用户友好的设置.
plt.rcParams.update({
"text.usetex": True,
"font.family": "Helvetica"
})
现在为 PDF/PS 后端启用了 Type 42 子集化#
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 改进#
允许全局设置默认图例 labelcolor#
一个新的 rcParams["legend.labelcolor"] (default: 'None') 设置了 Figure.legend 的默认 labelcolor 参数.特殊值 'linecolor','markerfacecolor' (或 'mfc') 或 'markeredgecolor' (或 'mec') 将导致图例文本与标记的相应颜色匹配.
(Source code, png)
3D 轴改进#
Axes3D 现在允许手动控制绘制顺序#
Axes3D 类现在具有 computed_zorder 参数.当设置为 False 时,Artist 将使用其 zorder 属性进行绘制.
(Source code, png)
允许更改 3D 图中的垂直轴#
view_init 现在具有参数 vertical_axis,该参数允许切换哪个轴垂直对齐.
(Source code, png)
plot_surface 支持掩码数组和 NaN#
axes3d.Axes3D.plot_surface 支持掩码数组和 NaN,现在将隐藏包含掩码或 NaN 点的四边形.该行为类似于 Axes.contour ,具有 corner_mask=True .
(Source code, png)
3D 绘图方法支持 data 关键字参数#
为了与所有 2D 绘图方法匹配,3D Axes 现在支持 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)
交互式工具改进#
Colorbar 现在具有平移和缩放功能#
具有 colorbar 的交互式图现在可以在 colorbar 轴上进行缩放和平移. 这会调整与 colorbar 关联的 ScalarMappable 的 vmin 和 vmax. 目前,这仅适用于连续范数. 与 contourf 和 categoricals 一起使用的范数(例如 BoundaryNorm 和 NoNorm )默认情况下禁用交互功能. cb.ax.set_navigate() 可用于设置 colorbar 轴是否具有交互性.
更新了 Slider 小部件的外观#
Slider 和 RangeSlider 小部件的外观已更新,并为添加的句柄提供了新的样式参数.
(Source code, png)
删除 PolygonSelector 上的点#
在完成 PolygonSelector 后,现在可以通过右键单击来删除各个点.
拖动选择器#
SpanSelector , RectangleSelector 和 EllipseSelector 有一个新的关键字参数 drag_from_anywhere,当设置为 True 时,允许您从选择器内的任何位置单击并拖动以移动它. 以前,只能通过激活移动修饰符按钮或单击中心句柄来移动它.
SpanSelector 的大小现在可以使用边缘句柄进行更改.
清除选择器#
选择器( EllipseSelector , LassoSelector , PolygonSelector , RectangleSelector 和 SpanSelector )有一个新的方法 clear,它将清除当前选择并使选择器准备好进行新的选择.这相当于按下 Escape 键.
设置选择器的艺术家属性#
可以使用 set_props 和 set_handle_props 方法更改 EllipseSelector , LassoSelector , PolygonSelector , RectangleSelector 和 SpanSelector 选择器的艺术家属性.
忽略选择范围外的事件#
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(float),它设置数学文本的字体大小(以磅为单位);mathmpl_srcset(str 列表),它提供了一个大小列表以支持 responsive resolution images . 该列表应包含额外的 x 描述符 ('1.5x','2x', etc.) 来生成(1x 是默认值并且始终包含.)
后端特定的改进#
GTK 后端#
已添加支持 GTK4 的后端. 支持 Agg 和 Cairo 渲染器. GTK4 后端可以选择为 GTK4Agg 或 GTK4Cairo.
Qt 后端#
已添加对 Qt6 (使用 PyQt6 或 PySide6)的支持,使用 Agg 或 Cairo 渲染器. 同时,已删除对 Qt4 的支持. Qt6 和 Qt5 都由组合后端(QtAgg 或 QtCairo)支持,并且加载的版本由已经导入的模块, QT_API 环境变量和可用的软件包决定. 有关详细信息,请参见 QT_bindings . 版本化的 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 后端.
版本信息#
我们切换到了 setuptools-scm 的 release-branch-semver 版本方案.这只会影响开发版本的版本信息.它们的版本号现在描述了目标发布版本,例如 3.5.0.dev820+g6768ef8c4c 是前一个版本发布后的第 820 次提交,并计划稍后正式发布为 3.5.0.
除了字符串 __version__ 之外,现在还有一个名为 __version_info__ 的命名元组,它的建模方式与 sys.version_info 类似.它的主要用途是安全地比较版本信息,例如 if __version_info__ >= (3, 4, 2) .