Matplotlib 3.8.0 中的新功能(2023 年 9 月 13 日)#

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

类型提示#

Matplotlib 现在为大多数公共 API 提供第一方 PEP484 样式类型提示文件。

虽然这些类型提示仍然被认为是临时的,并且可能会发生变化(有时我们还不能完全明确我们想要什么),但它们应该为类型检查许多常见的用法模式以及与许多编辑器/IDE集成提供合理的基础。

绘图和注释改进#

支持自定义文本和注释的抗锯齿#

matplotlib.pyplot.annotate()matplotlib.pyplot.text() 现在支持参数 *antialiased*。当 *antialiased* 设置为 True 时,将对文本应用抗锯齿。当 *antialiased* 设置为 False 时,将不对文本应用抗锯齿。当未指定 *antialiased* 时,抗锯齿将由 rcParams["text.antialiased"](默认值:True)在创建 TextAnnotation 对象时设置。示例

mpl.text.Text(.5, .5, "foo\nbar", antialiased=True)
plt.text(0.5, 0.5, '6 inches x 2 inches', antialiased=True)
ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5), antialiased=False)

如果文本包含数学表达式,*antialiased* 将应用于整个文本。示例

# no part will be antialiased for the text below
plt.text(0.5, 0.25, r"$I'm \sqrt{x}$", antialiased=False)

另请注意,刻度标签的抗锯齿将使用 rcParams["text.antialiased"](默认值:True)在创建时设置(通常在创建 Figure 时),之后无法更改。

此外,通过这项新功能,您可能需要确保在相同的上下文中创建和保存/显示图形

# previously this was a no-op, now it is what works
with rccontext(text.antialiased=False):
    fig, ax = plt.subplots()
    ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5))
    fig.savefig('/tmp/test.png')


# previously this had an effect, now this is a no-op
fig, ax = plt.subplots()
ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5))
with rccontext(text.antialiased=False):
    fig.savefig('/tmp/test.png')

AutoMinorLocator 分割的 rcParams#

添加了 rcParams rcParams["xtick.minor.ndivs"] (默认值:'auto') 和 rcParams["ytick.minor.ndivs"] (默认值:'auto') 以启用设置默认的分割数量;如果设置为 auto,则分割数量将由主刻度之间的距离选择。

Axline 设置器和获取器#

axes.Axes.axline 返回的对象现在支持其 *xy1*,*xy2* 和 *slope* 属性的 getter 和 setter 方法

line1.get_xy1()
line1.get_slope()
line2.get_xy2()
line1.set_xy1(.2, .3)
line1.set_slope(2.4)
line2.set_xy2(.1, .6)

轮廓图的剪切#

contourcontourf 现在接受 *clip_path* 参数。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

x = y = np.arange(-3.0, 3.01, 0.025)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

fig, ax = plt.subplots()
patch = mpatches.RegularPolygon((0, 0), 5, radius=2,
                                transform=ax.transData)
ax.contourf(X, Y, Z, clip_path=patch)

plt.show()

源代码2x.pngpng

Axes.ecdf#

一个新的 Axes 方法 ecdf 允许绘制经验累积分布函数,而无需任何分箱。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.ecdf(np.random.randn(100))

源代码2x.pngpng

Figure.get_suptitle(), Figure.get_supxlabel(), Figure.get_supylabel()#

这些方法分别返回由 Figure.suptitle()Figure.supxlabel()Figure.supylabel() 设置的字符串。

Ellipse.get_vertices(), Ellipse.get_co_vertices()#

这些方法返回长轴和短轴的椭圆顶点的坐标。此外,还添加了一个示例库演示,该演示展示了如何向椭圆添加箭头,以显示椭圆的顺时针或逆时针旋转。为了将箭头准确地放置在椭圆上,使用了顶点的坐标。

删除 label_outer() 中的内部刻度#

到目前为止,label_outer() 仅删除了刻度标签。刻度线仍然可见。现在可以通过新参数 label_outer(remove_inner_ticks=True) 进行配置。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)

fig, axs = plt.subplots(2, 2, sharex=True, sharey=True,
                        gridspec_kw=dict(hspace=0, wspace=0))

axs[0, 0].plot(x, np.sin(x))
axs[0, 1].plot(x, np.cos(x))
axs[1, 0].plot(x, -np.cos(x))
axs[1, 1].plot(x, -np.sin(x))

for ax in axs.flat:
    ax.grid(color='0.9')
    ax.label_outer(remove_inner_ticks=True)

源代码2x.pngpng

可配置的图例阴影#

图例的 *shadow* 参数现在除了布尔值外,还接受字典。字典可以包含 patches.Patch 的任何关键字。例如,这允许您设置图例阴影的颜色和/或透明度

ax.legend(loc='center left', shadow={'color': 'red', 'alpha': 0.5})

并控制阴影位置

ax.legend(loc='center left', shadow={"ox":20, "oy":-20})

当前不支持通过 rcParams["legend.shadow"](默认值:False)进行配置。

MultipleLocator 的 offset 参数#

现在可以指定 *offset* 来将所有刻度按给定的值移动。

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker

_, ax = plt.subplots()
ax.plot(range(10))
locator = mticker.MultipleLocator(base=3, offset=0.3)
ax.xaxis.set_major_locator(locator)

plt.show()

源代码2x.pngpng

添加新的有效颜色格式 (matplotlib_color, alpha)#

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle

fig, ax = plt.subplots()

rectangle = Rectangle((.2, .2), .6, .6,
                      facecolor=('blue', 0.2),
                      edgecolor=('green', 0.5))
ax.add_patch(rectangle)

源代码2x.pngpng

用户可以使用新的颜色规范 *(matplotlib_color,alpha)* 定义颜色。请注意,显式的 alpha 关键字参数将覆盖 *(matplotlib_color,alpha)* 中的 alpha 值。

可以控制饼图阴影#

现在,pieshadow 参数可以是一个字典,从而可以更精细地控制使用的 Shadow 补丁。

PolyQuadMesh 是一个用于绘制四边形网格的新类#

pcolor 之前返回的是一个扁平的 PolyCollection,其中只包含有效的(未被屏蔽的)多边形。现在,我们返回一个 PolyQuadMesh,它是一个混合类,结合了二维数组和网格坐标处理的实用性,同时仍然继承了 PolyCollection 的绘制方法。这使得它比从 pcolormesh 返回的常规 QuadMesh 能够更好地控制渲染属性。这个新类继承自 PolyCollection,因此应该仍然与之前表现相同。这个新类会跟踪用户的掩码,并适当地更新发送到渲染器的多边形。

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

阴影的深浅可以控制#

现在,Shadow 补丁有一个 shade 参数来控制阴影的深浅。如果为 1,则阴影为黑色;如果为 0,则阴影颜色与被遮蔽的补丁相同。默认值(之前是固定的)为 0.7。

SpinesProxy 现在支持调用 set() 方法#

现在可以调用例如 ax.spines[:].set(visible=False)

允许使用关键字参数设置刻度标签字体#

Axes.tick_params 现在接受 labelfontfamily 关键字,该关键字可以单独更改刻度标签字体,而不影响其他文本对象。

Axis.tick_params(labelfontfamily='monospace')

图形、坐标轴和图例布局#

savefig 的 pad_inches="layout"#

当使用约束或压缩布局时,

savefig(filename, bbox_inches="tight", pad_inches="layout")

现在将使用布局引擎上定义的填充大小。

添加一个公共方法来修改 Legend 的位置#

现在,在定义 Legend 的位置后,可以对其进行调整。

from matplotlib import pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

x = list(range(-100, 101))
y = [i**2 for i in x]

ax.plot(x, y, label="f(x)")
ax.legend()
ax.get_legend().set_loc("right")
# Or
# ax.get_legend().set(loc="right")

plt.show()

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

rcParams['legend.loc'] 现在接受浮点数元组输入#

rcParams["legend.loc"] (默认值:'best')rcParams 现在接受浮点数元组输入,与 Legendloc 关键字参数相同。这允许用户以更灵活和一致的方式设置图例的位置。

Mathtext 改进#

对 Mathtext 进行了改进,Mathtext 是 Matplotlib 的原生类 TeX 数学解析器(请参阅 编写数学表达式,不要与 Matplotlib 直接使用 LaTeX 混淆:使用 LaTeX 渲染文本)。

粗体符号 mathtext 命令 \boldsymbol#

支持在 mathtext 中使用 \boldsymbol{} 命令。

要将符号更改为粗体,请将文本包含在如下所示的字体命令中

r'$\boldsymbol{a+2+\alpha}$'
\[\boldsymbol{a+2+\alpha}\]

mathtext 有更多可调整大小的分隔符#

添加了 \lgroup\rgroup 可调整大小的分隔符。

以下分隔符名称之前已支持,但现在可以使用 \left\right 进行大小调整

  • \lbrace, \rbrace, \leftbrace, 和 \rightbrace

  • \lbrack\rbrack

  • \leftparen\rightparen

使用这些实际上没有明显的好处。相反,添加它们是为了完整性。

mathtext 文档改进#

文档已更新为直接从解析器获取信息。这意味着(几乎)所有支持的符号、运算符等都显示在 编写数学表达式 中。

mathtext 现在支持 \substack#

\substack 可用于在公式中创建多行下标或上标。

要使用它,请将数学式包含在如下所示的 substack 命令中

r'$\sum_{\substack{1\leq i\leq 3\\ 1\leq j\leq 5}}$'

mathtext 现在支持 \middle 分隔符#

添加了 \middle 分隔符,现在可以与 \left\right 分隔符一起使用

要使用 middle 命令,请将其包含在如下所示的 \left\right 分隔符命令之间

r'$\left( \frac{a}{b} \middle| q \right)$'

mathtext 运算符#

当使用 Unicode 字体时,添加和更正了许多运算符。此外,还为许多之前的运算符添加了正确的间距。特别是,用于 \gnapprox\lnapprox\leftangle\rightangle 的字符已得到更正。

mathtext 间距校正#

由于文档的更新,许多关系和运算符符号上的间距被如此分类,因此将正确地间隔。

mathtext 现在支持 \text#

\text 可用于在公式中获得直立文本,并获得普通破折号 (-)。

import matplotlib.pyplot as plt
plt.text(0.1, 0.5, r"$a = \sin(\phi) \text{ such that } \phi = \frac{x}{y}$")
plt.text(0.1, 0.3, r"$\text{dashes (-) are retained}$")

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

Illustration of the newly added \text command, showing that it renders as normal text, including spaces, despite being part of an equation. Also show that a dash is not rendered as a minus when part of a \text command.

粗斜体 mathtext 命令 \mathbfit#

支持在 mathtext 中使用 \mathbfit{} 命令使用粗斜体字体样式

要将字体更改为粗体和斜体,请将文本包含在如下所示的字体命令中

r'$\mathbfit{\eta \leq C(\delta(\eta))}$
\[\mathbfit{\eta \leq C(\delta(\eta))}\]

3D 绘图改进#

为 3D 绘图指定刻度和轴标签位置#

现在您可以为 3D 绘图指定刻度和轴标签的位置。

import matplotlib.pyplot as plt

positions = ['lower', 'upper', 'default', 'both', 'none']
fig, axs = plt.subplots(2, 3, figsize=(12, 8),
                        subplot_kw={'projection': '3d'})
for ax, pos in zip(axs.flatten(), positions):
    for axis in ax.xaxis, ax.yaxis, ax.zaxis:
        axis.set_label_position(pos)
        axis.set_ticks_position(pos)
    title = f'position="{pos}"'
    ax.set(xlabel='x', ylabel='y', zlabel='z', title=title)
axs[1, 2].axis('off')

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

3D 悬停坐标#

3D 绘图中显示的 x、y、z 坐标之前显示的是无意义的值。此问题已修复,现在报告鼠标光标正下方视图窗格上的坐标。当使用正交投影沿主轴方向查看 3D 绘图时,或者当 2D 绘图投影到其中一个 3D 轴窗格上时,此功能可能最有用。请注意,仍然没有办法直接显示绘制数据点的坐标。

3D 绘图可以共享视角#

3D 绘图现在可以共享相同的视角,因此当您旋转一个绘图时,其他绘图也会旋转。这可以通过添加轴时使用 shareview 关键字参数来完成,或者通过使用现有 3D 轴的 ax1.shareview(ax2) 方法来完成。

其他改进#

macosx: 新图形可以在窗口或标签页中打开#

有一个新的 rcParams["macosx.window_mode"] (默认值:'system') rcParam 来控制如何使用 macosx 后端打开新图形。默认值为 system,它使用系统设置,或者可以指定 tabwindow 来显式选择用于打开新图形的模式。

matplotlib.mpl_toolkits 现在是一个隐式命名空间包#

setuptools 67.3.0 中弃用 pkg_resources.declare_namespace 后,matplotlib.mpl_toolkits 现在按照 PEP 420 实现为隐式命名空间。

Plot 指令现在可以使用 "srcset" 制作响应式图像#

plot sphinx 指令 (matplotlib.sphinxext.plot_directive, 在 rst 中调用为 .. plot::) 可以配置为自动制作更高分辨率的图形,并将其添加到构建的 html 文档中。 在 conf.py

extensions = [
...
    'matplotlib.sphinxext.plot_directive',
    'matplotlib.sphinxext.figmpl_directive',
...]

plot_srcset = ['2x']

将为 hiDPI 显示屏制作分辨率加倍的 png 文件。生成的 html 文件将具有如下所示的图像条目

<img src="../_images/nestedpage-index-2.png" style="" srcset="../_images/nestedpage-index-2.png, ../_images/nestedpage-index-2.2x.png 2.00x" alt="" class="plot-directive "/>