Matplotlib 3.5.0 的新特性(2021 年 11 月 15 日)#

有关自上次修订以来的所有问题和拉取请求的列表,请参阅 3.10.0(2024 年 12 月 13 日)的 GitHub 统计数据

图形和轴的创建/管理#

subplot_mosaic 支持简单的轴共享#

Figure.subplot_mosaic, pyplot.subplot_mosaic 支持简单的轴共享(即,只能将 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')

(源代码, 2x.png, 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 是一个用于绘制椭圆环的新类。

(源代码, 2x.png, png)

FancyArrow 补丁的 set_data 方法#

FancyArrow,由 ax.arrow 返回的补丁,现在有一个 set_data 方法,允许在创建后修改箭头,例如用于动画。

ArrowStyleConnectionPatch 中的新箭头样式#

ArrowStyle 的新 arrow 参数取代了在创建箭头中使用 beginarrowendarrow 参数。它接收诸如 '<-'']-[' 和 ']->'' 之类的箭头字符串,而不是单个布尔值。

通过这种机制还添加了两种新样式 ']->''<-['。ConnectionPatch 通过其 arrowstyle 参数接受箭头样式,也接受这些新样式。

(源代码, 2x.png, png)

初始化后设置集合偏移变换#

添加的 collections.Collection.set_offset_transform 可用于在初始化后设置偏移变换。当在 Axes 对象外部创建 collections.Collection,然后使用 Axes.add_collection() 添加并设置偏移变换为 Axes.transData 时,这会很有帮助。

颜色和颜色图#

颜色图注册表(实验性)#

颜色图现在通过 matplotlib.colormaps(或 pyplot.colormaps)进行管理,它是 ColormapRegistry。虽然我们确信 API 已最终确定,但我们将其正式标记为 3.5 的实验性 API,因为我们希望保留在需要时仍然可以为 3.6 修改 API 的选项。

可以使用项访问获取颜色图

import matplotlib.pyplot as plt
cmap = plt.colormaps['viridis']

要注册新的颜色图,请使用

plt.colormaps.register(my_colormap)

我们建议对新代码使用新的 API,而不是 matplotlib.cm.get_cmapmatplotlib.cm.register_cmap 函数。matplotlib.cm.get_cmapmatplotlib.cm.register_cmap 最终将被弃用和删除。在 pyplot 中,plt.get_cmap()plt.register_cmap() 将继续受支持以实现向后兼容性。

现在可以在 RGBA 阶段进行图像插值#

在 Matplotlib 中,通过 imshow 创建的图像会被重采样以匹配当前画布的分辨率。当进行降采样以减少莫尔条纹效应时,应用自动抗锯齿滤波会很有用。默认情况下,插值是在数据上完成的,然后应用范数,最后执行颜色映射。

然而,通常希望在 RGBA 空间中进行抗锯齿插值,即对颜色进行插值而不是数据。这通常会导致颜色超出颜色映射范围,但在视觉上会混合相邻的颜色,这正是浏览器和其他图像处理软件的做法。

imshow 提供了一个新的关键字参数interpolation_stage,用于设置抗锯齿插值发生的阶段。默认值是当前行为 "data",另一种选择是 "rgba",表示新可用的行为。

../../_images/sphx_glr_image_antialiasing_001.png

插值阶段选项的示例。#

有关更多详细信息,请参阅图像重采样中关于新关键字参数的讨论。

imshow 支持半精度浮点数组#

imshow 方法现在支持半精度浮点数组,即 dtype 为 np.float16 的 NumPy 数组。

已向 Normalize 对象添加了回调注册表#

colors.Normalize 对象现在有一个回调注册表 callbacks,其他对象可以通过该注册表连接并在范数更新时收到通知。当范数被修改时,回调会发出键 changedcm.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 参数。

字体和文本#

三点和四点数学文本重音符号#

除了单点和双点重音符号外,数学文本现在支持三点和四点重音符号。

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')

源代码2x.pngpng

图例标题的字体属性可配置#

标题的字体属性可以通过 title_fontproperties 关键字参数设置,例如

源代码2x.pngpng

TextTextBox 添加了 parse_math 选项#

TextTextBox 对象现在允许使用仅关键字参数 parse_math,该参数控制是否应该从显示的字符串中解析数学表达式。如果为 True,则该字符串将作为数学文本对象进行解析。如果为 False,则该字符串将被视为文字,不会进行任何解析。

文本可以放置在 TextBox 小部件内部#

一个新的参数 textalignment 可用于控制 TextBox 小部件的 Axes 中文本的位置。

源代码2x.pngpng

简化 usetex 模式的字体设置#

现在,rcParams["font.family"](默认值:['sans-serif'])接受一些字体名称作为值,以实现更友好的用户设置。

plt.rcParams.update({
    "text.usetex": True,
    "font.family": "Helvetica"
})

现在为 PDF/PS 后端启用了 Type 42 子集化#

backend_pdfbackend_ps 现在使用统一的 Type 42 字体子集化接口,借助 fontTools

rcParams["pdf.fonttype"] (默认值:3)或 rcParams["ps.fonttype"] (默认值: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"] (默认值: 'None') 设置 Figure.legend 的默认 labelcolor 参数。特殊值 'linecolor','markerfacecolor' (或 'mfc'),或 'markeredgecolor' (或 'mec') 将使图例文本与标记的相应颜色匹配。

(源代码, 2x.png, png)

3D 轴改进#

Axes3D 现在允许手动控制绘制顺序#

Axes3D 类现在具有 computed_zorder 参数。当设置为 False 时,将使用其 zorder 属性绘制 Artist。

(源代码, 2x.png, png)

允许更改 3D 图中的垂直轴#

view_init 现在具有参数 vertical_axis,允许切换哪个轴垂直对齐。

(源代码, 2x.png, png)

plot_surface 支持掩码数组和 NaN#

axes3d.Axes3D.plot_surface 支持掩码数组和 NaN,现在将隐藏包含掩码或 NaN 点的四边形。该行为类似于 Axes.contourcorner_mask=True

(源代码, 2x.png, png)

3D 绘图方法支持 data 关键字参数#

为了与所有 2D 绘图方法匹配,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)

交互式工具改进#

颜色条现在具有平移和缩放功能#

带有颜色条的交互式绘图现在可以在颜色条轴上进行缩放和平移。这将调整与颜色条关联的 ScalarMappablevminvmax。目前,这仅对连续范数启用。用于 contourf 和类别(例如 BoundaryNormNoNorm)的范数默认禁用交互功能。cb.ax.set_navigate() 可用于设置颜色条轴是否可交互。

更新了滑块小部件的外观#

更新了 SliderRangeSlider 小部件的外观,并为添加的句柄提供了新的样式参数。

(源代码, 2x.png, png)

在 PolygonSelector 上移除点#

完成 PolygonSelector 后,现在可以通过右键单击来删除单个点。

拖动选择器#

SpanSelectorRectangleSelectorEllipseSelector 有一个新的关键字参数 drag_from_anywhere,当设置为 True 时,允许您从选择器内的任何位置单击并拖动以移动它。以前,只能通过激活移动修饰符按钮或单击中心句柄来移动它。

现在可以使用边缘句柄更改 SpanSelector 的大小。

清除选择器#

选择器(EllipseSelectorLassoSelectorPolygonSelectorRectangleSelectorSpanSelector)具有新方法 clear,它将清除当前选择并使选择器准备好进行新选择。这等效于按 escape 键。

设置选择器的艺术家属性#

可以使用 set_propsset_handle_props 方法更改 EllipseSelectorLassoSelectorPolygonSelectorRectangleSelectorSpanSelector 选择器的艺术家属性。

忽略选择区域外的事件#

EllipseSelectorRectangleSelectorSpanSelector 选择器有一个新的关键字参数 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 列表),提供支持 响应式分辨率图像 的大小列表。该列表应包含额外的 x 描述符('1.5x''2x' 等)以生成(1x 是默认值并且始终包含)。

后端特定改进#

GTK 后端#

添加了支持 GTK4 的后端。支持 Agg 和 Cairo 渲染器。GTK4 后端可以选择为 GTK4Agg 或 GTK4Cairo。

Qt 后端#

添加了对 Qt6(使用 PyQt6PySide6)的支持,同时支持 Agg 或 Cairo 渲染器。同时,已删除对 Qt4 的支持。组合后端(QtAgg 或 QtCairo)支持 Qt6 和 Qt5,加载的版本由已导入的模块、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 选项现在在轴缩放选项中可用。“曲线”选项卡中现在显示所有具有相同标签的条目。

WX 后端支持鼠标导航按钮#

WX 后端现在支持使用鼠标前进/后退按钮导航视图状态,就像在其他后端中一样。

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)