Matplotlib 3.4.0(2021年3月26日)的新增功能#

有关自上次修订以来的所有问题和拉取请求列表,请参阅 GitHub 3.11.0 版本统计信息 (2026年6月11日)

图形(Figure)和坐标轴(Axes)的创建/管理#

新的子图(subfigure)功能#

新的 figure.Figure.add_subfigurefigure.Figure.subfigures 功能允许在图形内创建虚拟图形。类似的嵌套以前是通过嵌套的 gridspecs 实现的(参见 嵌套 Gridspecs)。但是,这不允许使用仅属于每个 subgridspec 的局部图形元素(例如颜色条或 suptitle)。

新的方法 figure.Figure.add_subfigurefigure.Figure.subfigures 旨在与 figure.Figure.add_subplotfigure.Figure.subplots 对应,并且具有大部分相同的参数。

更多详细信息,请参阅 图形子图

注意

截至 v3.4,子图功能为实验性 API。

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

subplot_mosaic 的单行字符串表示法#

Figure.subplot_mosaicpyplot.subplot_mosaic 现在接受单行字符串,使用分号分隔行。即,

plt.subplot_mosaic(
    """
    AB
    CC
    """)

可以写成更短的

plt.subplot_mosaic("AB;CC")

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

坐标轴创建方法(gca, add_axes, add_subplot)的行为变更#

用于创建新坐标轴的函数(pyplot.axes, pyplot.subplot, figure.Figure.add_axes, figure.Figure.add_subplot)的行为已更改。过去,这些函数会检测您是否试图使用与当前图形中已存在的坐标轴相同的关键字参数来创建坐标轴,如果是,它们将返回现有的坐标轴。现在,pyplot.axesfigure.Figure.add_axesfigure.Figure.add_subplot 将始终创建新的坐标轴。pyplot.subplot 将继续复用具有匹配子图规范和相等 kwargs 的现有坐标轴。

相应地,用于获取当前坐标轴的函数(pyplot.gca, figure.Figure.gca)的行为也发生了变化。过去,这些函数接受关键字参数。如果关键字参数与现有的坐标轴匹配,则返回该坐标轴,否则使用这些关键字参数创建新的坐标轴。现在,仅当当前图形中完全没有坐标轴时,才会考虑这些关键字参数。在未来的版本中,这些函数将不再接受任何关键字参数。

add_subplot/add_axes 新增了 axes_class 参数#

特别地,现在可以按照惯例使用 mpl_toolkits 坐标轴子类,例如使用 fig.add_subplot(axes_class=mpl_toolkits.axislines.Axes)

Subplot 和 subplot2grid 现在可以与约束布局(constrained layout)配合使用#

constrained_layout 依赖于图形上每个逻辑布局的单一 GridSpec。以前,pyplot.subplotpyplot.subplot2grid 每次调用都会添加一个新的 GridSpec,因此与 constrained_layout 不兼容。

现在 subplot 会尝试复用 GridSpec(如果行数和列数与图形中已有的顶级 GridSpec 相同),即 plt.subplot(2, 1, 2) 将使用与 plt.subplot(2, 1, 1) 相同的 GridSpec,并且 Figureconstrained_layout=True 选项将生效。

相反,混合使用 nrowsncols不能constrained_layout 一起使用:先调用 plt.subplot(2, 2, 1) 再调用 plt.subplots(2, 1, 2) 仍会产生两个 GridSpec,导致 constrained_layout=True 产生不好的结果。为了达到预期效果,第二次调用可以指定第二个坐标轴打算覆盖的单元格:plt.subplots(2, 2, (2, 4)),或者使用更 Pythonic 的 plt.subplot2grid((2, 2), (0, 1), rowspan=2)

绘图方法#

axline 支持 transform 参数#

axline 现在支持 transform 参数,该参数适用于点 xy1xy2slope(如果提供)始终在数据坐标中。

例如,这可以与 ax.transAxes 结合使用以绘制固定斜率的线。在下图中,尽管两个坐标轴显示不同的数据限制,但该线出现在两个坐标轴上的相同点处。

fig, axs = plt.subplots(1, 2)

for i, ax in enumerate(axs):
    ax.axline((0.25, 0), slope=2, transform=ax.transAxes)
    ax.set(xlim=(i, i+5), ylim=(i, i+5))

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

条形图新增自动标签功能#

新增了 Axes.bar_label 方法,用于条形图的自动标注。

../../_images/sphx_glr_bar_label_demo_001.png

新自动标注功能的示例。#

可以为 barbarh 指定填充图案列表#

类似于其他一些矩形属性,现在可以将填充样式列表传递给 barbarh,以创建具有不同填充样式的条形,例如:

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

设置 BarContainer 的方向#

BarContainer 现在接受一个新的字符串参数 orientation。它可以是 'vertical''horizontal',默认值为 None

等高线图现在默认使用 ScalarFormatter#

fmt="%1.3f" 传递给等高线调用以恢复旧的默认标签格式。

Axes.errorbar 现在可以正确循环非颜色属性#

以前,如果明确指定了颜色,Axes.errorbar 会错误地跳过坐标轴属性循环,即使属性循环器是用于其他属性(例如线型)的。现在,Axes.errorbar 将像 Axes.plot 一样推进坐标轴属性循环,即只要循环器中的所有属性没有被显式传递。

例如,以下代码将循环遍历线型

x = np.arange(0.1, 4, 0.5)
y = np.exp(-x)
offsets = [0, 1]

plt.rcParams['axes.prop_cycle'] = plt.cycler('linestyle', ['-', '--'])

fig, ax = plt.subplots()
for offset in offsets:
    ax.errorbar(x, y + offset, xerr=0.1, yerr=0.3, fmt='tab:blue')

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

errorbarerrorevery 参数与 markevery 匹配#

类似于 plotmarkevery 参数,errorbarerrorevery 参数现在接受切片和 NumPy 花式索引(必须与 x 的大小匹配)。

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

hexbin 支持为 C 参数使用数据引用#

xy 参数一样,Axes.hexbin 现在支持使用数据引用传递 C 参数。

data = {
    'a': np.random.rand(1000),
    'b': np.random.rand(1000),
    'c': np.random.rand(1000),
}

fig, ax = plt.subplots()
ax.hexbin('a', 'b', C='c', data=data, gridsize=10)

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

支持使用可调用对象来格式化 Sankey 标签#

matplotlib.sankey.Sankeyformat 参数现在可以接受可调用对象。

这允许使用任意函数来标记流量,例如允许将数字映射为表情符号。

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

Axes.spines 访问快捷方式#

Axes.spines 现在是一个专门的容器类 Spines,用于存放一组 Spine,而不是 OrderedDict。除了类似字典的访问外,Axes.spines 现在还支持一些类似 pandas.Series 的特性。

通过项或属性访问单个元素

ax.spines['top'].set_visible(False)
ax.spines.top.set_visible(False)

访问子集项

ax.spines[['top', 'right']].set_visible(False)

同时访问所有项

ax.spines[:].set_visible(False)

新增 stairs 方法和 StepPatch 绘图对象#

pyplot.stairs 和底层绘图对象 StepPatch 为绘制阶梯状常数函数提供了更简洁的接口(对于您已知阶梯边缘的常见情况)。这取代了 pyplot.step 的许多用例,例如在绘制 numpy.histogram 的输出时。

对于绘图对象和函数,x 样式的边缘输入比 y 样式的值输入长一个元素

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

参见 阶梯演示 获取示例。

为词干图添加了 orientation 参数#

默认情况下,词干线是垂直的。它们可以通过 Axes.stempyplot.stemorientation 参数更改为水平。

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

支架箭头样式上的角度#

Bracket 箭头样式(传递给 FancyArrowPatcharrowstyle 参数的 ]-[, ]-, -[, 或 |-|)上指定的角度现在已应用。此前,angleAangleB 选项是允许的,但不起作用。

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

TickedStroke 路径效果#

新的 TickedStroke 路径效果可用于产生带刻度的线样式。这可以用于区分优化解空间中约束边界的有效和无效侧等。

../../_images/sphx_glr_tickedstroke_demo_002.png

颜色和色图#

集合颜色的指定与映射#

重构颜色映射处理以及 facecoloredgecolor 的关键字参数导致了三种行为变更

  1. 可以通过调用 Collection.set_array(None) 关闭颜色映射。此前,此操作无效。

  2. 当设置了可映射数组,且 facecolor='none'edgecolor='face' 时,面和边缘都不会被着色。此前边缘会被颜色映射。

  3. 当设置了可映射数组,且 facecolor='none'edgecolor='red' 时,边缘为红色。这解决了问题 #1302。此前边缘会被颜色映射。

集合中的透明度(alpha)可以设置为数组#

以前,控制集合中透明度的 alpha 值只能指定为应用于集合中所有元素的标量。例如,scatter 图中的所有标记,或 pcolormesh 图中的所有四边形,都具有相同的 alpha 值。

现在可以将 alpha 作为数组提供,集合中的每个元素(标记、四边形等)对应一个值。

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

pcolormesh 通过启用吸附(snapping)改善了透明度处理#

由于关键字参数 snapping 传递给 Agg 后端的方式,以前版本的 Matplotlib 在透明网格边缘之间似乎显示线条。此版本默认应用吸附。要恢复旧行为(例如,用于测试图像),可以将 rcParams["pcolormesh.snap"](默认值:True)设置为 False

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

注意,主图网格边界之间有线条,其透明度不同。当透明度添加到色图时,颜色条也会显示这些线条,因为它在内部使用 pcolormesh 来绘制颜色条。默认开启吸附(下方),网格边界处的线条就会消失。

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

Colormap 对象的 IPython 表示#

matplotlib.colors.Colormap 对象现在具有用于 IPython / Jupyter 后端的图像表示。最后一行返回色图的单元格将显示该色图的图像。

In[1]: cmap = plt.get_cmap('viridis').with_extremes(bad='r', under='g', over='b')

In[2]: cmap
Out[2]:
viridis
viridis colormap
under
bad
over

Colormap.set_extremesColormap.with_extremes#

因为 Colormap.set_badColormap.set_underColormap.set_over 方法是原地修改色图的,用户在设置极端颜色(例如内置色图)时需要小心,首先对色图进行复制。

新的 Colormap.with_extremes(bad=..., under=..., over=...) 可用于先复制色图并在该副本上设置极端颜色。

提供了新的 Colormap.set_extremes 方法以实现与 Colormap.with_extremes 的 API 对称,但请注意,它与较早的单独设置器存在相同的问题。

获取 Colormap 对象的下限/上限/无效值颜色#

matplotlib.colors.Colormap 现在具有方法 get_underget_overget_bad,用于获取超出范围和掩码值所使用的颜色。

新增 cm.unregister_cmap 函数#

matplotlib.cm.unregister_cmap 允许用户移除之前注册过的色图。

新增用于围绕中心对称数据的 CenteredNorm#

在数据围绕中心对称的情况下(例如围绕中心零点的正负异常),CenteredNorm 是一种新的范数,它自动创建围绕中心的对称映射。该范数非常适合与中心使用不饱和颜色的发散色图结合使用。

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

如果对称中心不同于 0,则可以使用 vcenter 参数设置。要手动设置 CenteredNorm 的范围,请使用 halfrange 参数。

有关示例和关于数据归一化的更多详细信息,请参阅 色图归一化

新增用于任意归一化的 FuncNorm#

FuncNorm 允许使用正向和反向函数进行任意归一化。

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

有关示例和关于数据归一化的更多详细信息,请参阅 色图归一化

基于 GridSpec 的颜色条现在可以放置在主坐标轴的上方或左侧#

... 通过在 colorbar() 调用中传递 location="top"location="left"

标题、刻度和标签#

supxlabel 和 supylabel#

可以使用新的 Figure.supxlabelFigure.supylabel 方法,向整个图形添加 x 和 y 标签,类似于 Figure.suptitle

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

共享坐标轴的 subplots 在顶部或左侧标签的刻度标签可见性现在是正确的#

调用 subplots(..., sharex=True, sharey=True) 时,Matplotlib 会自动隐藏不在第一列的坐标轴的 x 刻度标签,以及不在最后一行的坐标轴的 y 刻度标签。如果 rcParams 指定坐标轴应标记在顶部(rcParams["xtick.labeltop"] = True)或右侧(rcParams["ytick.labelright"] = True),则此行为是不正确的。

以下情况现在处理正确(根据需要调整第一行和最后一列坐标轴的可见性)

plt.rcParams["xtick.labelbottom"] = False
plt.rcParams["xtick.labeltop"] = True
plt.rcParams["ytick.labelleft"] = False
plt.rcParams["ytick.labelright"] = True

fig, axs = plt.subplots(2, 2, sharex=True, sharey=True)

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

可以将带有标签的可迭代对象传递给 Axes.plot#

通过将 2D 数据作为 y 值传递给 plot 来绘制多个数据集时,数据集的标签可以作为列表传递,其长度与 y 中的列数匹配。

x = [1, 2, 3]

y = [[1, 2],
     [2, 5],
     [4, 9]]

plt.plot(x, y, label=['low', 'high'])
plt.legend()

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

字体和文本#

文本变换可以旋转文本方向#

新的 Text 参数 transform_rotates_text 现在设置变换的旋转是否影响文本方向。

../../_images/sphx_glr_text_rotation_relative_to_line_001.png

transform_rotates_text 参数的示例#

matplotlib.mathtext 现在支持 oversetunderset LaTeX 符号#

mathtext 现在支持 oversetunderset,调用方式为 \overset{annotation}{body}\underset{annotation}{body},其中 annotation 是“上方”或“下方” body 的文本。

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

用于更改 Text 字体族的 math_fontfamily 参数#

新的 math_fontfamily 参数可用于更改绘图中每个单独文本元素的字体族。如果未设置参数,将使用全局值 rcParams["mathtext.fontset"](默认值:'dejavusans')。

../../_images/sphx_glr_mathtext_fontfamily_example_001.png

TextArea/AnchoredText 支持 horizontalalignment#

TextAreaAnchoredText 中的文本水平对齐方式现在可以指定,这主要对多行文本有效。

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

PDF 支持在 Text 绘图对象上使用 URL#

text.Text 绘图对象上的 URL(即来自 Artist.set_url)现在将被保存到 PDF 文件中。

rcParams 改进#

新增日期相关的 rcParams:设置转换器以及是否使用 interval_multiples#

新的 rcParams["date.converter"](默认值:'auto')允许使用字符串 'auto' 和 'concise' 在 matplotlib.dates.DateConvertermatplotlib.dates.ConciseDateConverter 之间切换。

新的 rcParams["date.interval_multiples"](默认值:True)允许在日期定位器尝试在设定的间隔(即月份的第 1 天和第 15 天)选择刻度,与从时间序列开始处的任何位置开始的等间距刻度之间进行切换。

dates = np.arange('2001-01-10', '2001-05-23', dtype='datetime64[D]')
y = np.sin(dates.astype(float) / 10)
fig, axs = plt.subplots(nrows=2, constrained_layout=True)

plt.rcParams['date.converter'] = 'concise'
plt.rcParams['date.interval_multiples'] = True
axs[0].plot(dates, y)

plt.rcParams['date.converter'] = 'auto'
plt.rcParams['date.interval_multiples'] = False
axs[1].plot(dates, y)

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

日期格式化程序现在遵循 usetex rcParam#

AutoDateFormatterConciseDateFormatter 现在遵循 rcParams["text.usetex"](默认值:False),因此将使用与默认(非日期)格式化程序的 TeX 渲染一致的字体。TeX 渲染也可以通过在创建格式化程序实例时传递 usetex 参数来启用/禁用。

在下图中,x 轴(日期)和 y 轴(数字)现在都使用相同的(TeX)字体。

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

image.cmap 设置为 Colormap#

现在可以将 rcParams["image.cmap"](默认值:'viridis')设置为 Colormap 实例,例如使用上述新的 set_extremes 创建的色图。(这只能从 Python 代码中完成,不能从 matplotlibrc 文件中完成。)

使用 rcParams 可以独立设置刻度和刻度标签的颜色#

以前,rcParams["xtick.color"](默认值:'black')同时定义了刻度颜色和标签颜色。现在可以使用 rcParams["xtick.labelcolor"](默认值:'inherit')独立设置标签颜色。它默认为 'inherit',这将从 rcParams["xtick.color"](默认值:'black')获取值。同样适用于 ytick.[label]color。例如,要将刻度设置为浅灰色并将刻度标签设置为黑色,可以在脚本中使用以下代码

import matplotlib as mpl

mpl.rcParams['xtick.labelcolor'] = 'lightgrey'
mpl.rcParams['xtick.color'] = 'black'
mpl.rcParams['ytick.labelcolor'] = 'lightgrey'
mpl.rcParams['ytick.color'] = 'black'

或者通过将以下行添加到 matplotlibrc 文件或 Matplotlib 样式文件中

xtick.labelcolor : lightgrey
xtick.color      : black
ytick.labelcolor : lightgrey
ytick.color      : black

3D 坐标轴改进#

3D 坐标轴中的误差条方法#

误差条函数 Axes.errorbar 被完整移植到 3D 坐标轴框架中,支持的功能包括误差线和上限标记的自定义样式、对误差条间距的控制以及上下限标记。

../../_images/sphx_glr_errorbar3d_001.png

3D 坐标轴中的词干图#

现在在 3D 坐标轴上支持词干图。与 2D 词干图非常相似,stem 支持以各种方向绘制词干。

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

另请参阅 3D 词干 演示。

3D 集合属性现在可修改#

以前,用于 3D 效果的 3D 集合属性(例如修改颜色以产生深度阴影)在创建后无法更改。

现在可以随时修改 3D 集合的所有属性。

3D 坐标轴中的平移#

使用鼠标中键点击并拖动以平移 3D 坐标轴。

交互式工具改进#

新增 RangeSlider 部件#

widgets.RangeSlider 允许创建定义范围而不是单个值的滑块。

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

滑块现在可以吸附到任意值#

Slider UI 部件现在接受数组作为 valstep。这通过允许滑块吸附到任意值推广了之前的行为。

动画的暂停与恢复#

animation.Animation.pauseanimation.Animation.resume 方法允许您暂停和恢复动画。这些方法可以用作 UI 元素上事件监听器的回调函数,以便您的绘图可以具有一些播放控制 UI。

Sphinx 扩展#

plot_directivecaption 选项#

在使用外部源文件时,通过指定内容,以前支持 plot_directive 指令的标题

.. plot:: path/to/plot.py

    This is the caption for the plot.

:caption: 选项允许为外部

.. plot:: path/to/plot.py
    :caption: This is the caption for the plot.

和内联绘图指定标题

.. plot::
    :caption: This is a caption for the plot.

    plt.plot([1, 2, 3])

后端特定改进#

连续的光栅化绘图现已合并#

向量输出的元素可以通过 rasterized 关键字参数或 set_rasterized() 方法单独设置为光栅化。这有助于减小文件大小。对于包含多个光栅元素的图形,现在可以在不影响视觉输出的情况下,自动将它们合并为更少量的位图。对于包含大量元素的图形,这可以显著减小文件大小。

为确保此功能生效,请勿在光栅元素之间放置向量元素。

若要禁止此合并,请将 Figure.suppressComposite 设置为 True。

FFMpegFileWriter 支持 raw/rgba 帧格式#

使用 FFMpegFileWriter 时,frame_format 现在可以设置为 "raw""rgba"。这可能比图像格式稍快,因为 Matplotlib 和 FFmpeg 之间无需进行编码/解码。

nbAgg/WebAgg 支持鼠标中键和双击#

nbAgg 和 WebAgg 后端现在支持双击事件。此前,WebAgg 会将鼠标中键点击报告为右键点击,现在可以报告正确的按钮类型。

nbAgg 支持二进制通信#

如果 Web 浏览器和 Notebook 支持二进制 WebSocket,nbAgg 现在将使用它们来略微改善图形显示的传输效率。

在可能的情况下为 PDF 文件中的 PNG 图像使用索引颜色#

当 PNG 图像包含 256 色或更少颜色时,在保存为 PDF 之前,它们会被转换为索引颜色。在某些情况下,这可以显著减小文件大小。对于使用颜色映射但没有插值的栅格数据(例如 Healpy mollview 绘图)尤其如此。目前,此功能仅针对 RGB 图像执行。

改进了 PDF/PS 中的字体子集嵌入#

PDF 和 PostScript 中的字体子集嵌入已从嵌入的 ttconv C 代码重写为 Python 实现。某些复合字符和轮廓可能会有细微变化。这修复了 PDF 中的 ttc 子集问题,并增加了对 type 3 OTF 字体子集嵌入的支持,从而减小了文件大小(使用中日韩字体时减小更为明显),并避免了使用 type 42 嵌入以及在某些 PDF 阅读器(如 Acrobat Reader)中遇到的问题。

PDF 中的字符串增加了字距调整 (Kerning)#

与 Agg 后端生成的文本一样(示例请参见 前一个新特性条目),PDF 现在也在文本字符串中包含字距调整信息。

QtAgg 中的全分数 HiDPI 支持#

全分数 HiDPI(即非整数倍的 HiDPI 缩放比例)是在 Qt 5.14 中添加的,现在当使用该版本或更高版本的 Qt 时,QtAgg 后端对此提供支持。

wxAgg 支持全屏切换#

wxAgg 后端支持使用 f 快捷键或管理器函数 FigureManagerBase.full_screen_toggle 来切换全屏。