图形简介#

fig = plt.figure(figsize=(2, 2), facecolor='lightskyblue',
                 layout='constrained')
fig.suptitle('Figure')
ax = fig.add_subplot()
ax.set_title('Axes', loc='left', fontstyle='oblique', fontsize='medium')

( 代码, 2x.png, png)

在查看 Matplotlib 可视化时,你几乎总是在查看放置在 Figure 上的 Artists。在上面的示例中,图形是蓝色区域,而 add_subplot 已将 Axes artist 添加到 Figure 中(请参见 图形的各个部分)。更复杂的可视化可以向图形添加多个 Axes、颜色条、图例、注释,并且 Axes 本身可以添加多个 Artists(例如 ax.plotax.imshow)。

查看图形#

我们将在下面更详细地讨论如何创建图形,但首先了解如何查看图形会很有帮助。这根据你使用 Matplotlib 的方式以及你使用的 后端 而有所不同。

笔记本和 IDE#

Image of figure generated in Jupyter Notebook with inline backend.

使用默认 内联 后端通过 Jupyter Notebook 生成的图形的屏幕截图。#

如果你正在使用笔记本(例如 Jupyter)或呈现笔记本的 IDE(PyCharm、VSCode 等),那么它们有一个后端,当执行代码单元格时,它将呈现 Matplotlib 图形。默认 Jupyter 后端 (%matplotlib inline) 创建静态绘图,默认情况下,修剪或扩展图形大小,以便在添加到图形中的艺术家周围有一个紧凑的框(请参见 保存图形,如下所示)。对于 Jupyter 中的交互式绘图,你需要使用 ipython “magic”,例如 %matplotlib widget,用于 jupyter labnotebook>=7 中的 ipympl 后端,或 %matplotlib notebook,用于 notebook<7nbclassic 中的 Matplotlib 笔记本

注意

ipympl 后端在单独的包中,请参见 安装 ipympl

Image of figure generated in Jupyter Notebook with notebook backend, including a toolbar.

使用 %matplotlib notebook magic 生成的交互式图形的 Jupyter Notebook 屏幕截图。如果使用 JupyterLab,用户还应该尝试类似的 widget 后端。#

另请参见

交互式图形.

独立脚本和交互式使用#

如果用户在带有窗口系统的客户端中,则可以使用许多 后端 将图形渲染到屏幕上,通常使用 Python Qt、Tk 或 Wx 工具包,或本机 MacOS 后端。这些通常在用户的 matplotlibrc 中选择,或通过调用,例如,matplotlib.use('QtAgg') 在会话或脚本的开头。

Image of figure generated from a script via the QtAgg backend.

通过 python 脚本生成并使用 QtAgg 后端显示的图形的屏幕截图。#

当从脚本或交互式(例如,从 IPython shell)运行时,图形将不会显示,直到我们调用 plt.show()。图形将出现在一个新的 GUI 窗口中,并且通常会有一个工具栏,其中包含缩放、平移和其他用于与图形交互的工具。默认情况下,plt.show() 会阻止脚本或 shell 的进一步交互,直到图形窗口关闭,尽管可以出于某些目的将其关闭。有关更多详细信息,请参阅 交互模式

请注意,如果您在无法访问窗口系统的客户端上,则图形将回退到使用“Agg”后端绘制,并且无法查看,尽管可以 保存

另请参见

交互式图形.

创建图形#

迄今为止,创建图形最常见的方式是使用 pyplot 接口。如 Matplotlib 应用程序接口 (API) 中所述,pyplot 接口有两个用途。一是启动后端并跟踪 GUI 窗口。另一个是 Axes 和 Artists 的全局状态,允许使用简短的 API 来绘制方法。在上面的示例中,我们使用 pyplot 来实现第一个目的,并创建 Figure 对象 fig。作为副作用,fig 也被添加到 pyplot 的全局状态中,并且可以通过 gcf 访问。

用户在创建 Figure 时通常需要一个 Axes 或一个 Axes 网格,因此除了 figure 之外,还有一些便捷方法可以同时返回一个 Figure 和一些 Axes。可以使用 pyplot.subplots(它只是包装了 Figure.subplots)来实现一个简单的 Axes 网格。

fig, axs = plt.subplots(2, 2, figsize=(4, 3), layout='constrained')

( 代码, 2x.png, png)

可以使用 pyplot.subplot_mosaic(它包装了 Figure.subplot_mosaic)来实现更复杂的网格。

fig, axs = plt.subplot_mosaic([['A', 'right'], ['B', 'right']],
                              figsize=(4, 3), layout='constrained')
for ax_name, ax in axs.items():
    ax.text(0.5, 0.5, ax_name, ha='center', va='center')

( 代码, 2x.png, png)

有时我们希望在图中具有嵌套布局,其中两组或更多组轴不共享相同的子图网格。我们可以使用 add_subfiguresubfigures 在父图中创建虚拟图;有关更多详细信息,请参阅 图的子图

fig = plt.figure(layout='constrained', facecolor='lightskyblue')
fig.suptitle('Figure')
figL, figR = fig.subfigures(1, 2)
figL.set_facecolor('thistle')
axL = figL.subplots(2, 1, sharex=True)
axL[1].set_xlabel('x [m]')
figL.suptitle('Left subfigure')
figR.set_facecolor('paleturquoise')
axR = figR.subplots(1, 2, sharey=True)
axR[0].set_title('Axes 1')
figR.suptitle('Right subfigure')

( 代码, 2x.png, png)

可以直接实例化 Figure 实例,而无需使用 pyplot 接口。通常只有在您希望创建自己的 GUI 应用程序或服务时才需要这样做,而您不希望它携带 pyplot 全局状态。有关如何执行此操作的示例,请参阅 在图形用户界面中嵌入 Matplotlib 中的嵌入示例。

图选项#

创建图形时有几个可用的选项。屏幕上的图形大小由 figsizedpi 设置。figsize 是图形的 (宽度, 高度)(或如果愿意,则为 72 个印刷点的单位)。dpi 是图形的每英寸像素数。要使图形以您请求的物理尺寸显示在屏幕上,您应将 dpi 设置为与图形系统相同的 dpi。请注意,许多图形系统现在使用“dpi 比率”来指定用于表示图形像素的屏幕像素数。Matplotlib 将 dpi 比率应用于传递给图形的 dpi 以使其具有更高的分辨率,因此您应该将较低的数字传递给图形。

facecoloredgecolorlinewidthframeon 选项都以预期的方式更改图形的外观,如果将 frameon 设置为 False,则图形将变为透明。

最后,用户可以使用layout参数为图形指定布局引擎。目前,Matplotlib 提供 "constrained""compressed""tight" 布局引擎。这些引擎会重新调整图形中的坐标轴大小以防止刻度标签重叠,并尝试对齐坐标轴,这样可以为许多常见情况节省大量手动调整图形中艺术家的时间。

添加艺术家#

The Figure class has a number of methods for adding artists to a Figure or a SubFigure. By far the most common are to add Axes of various configurations (add_axes, add_subplot, subplots, subplot_mosaic) and subfigures (subfigures). Colorbars are added to Axes or group of Axes at the Figure level (colorbar). It is also possible to have a Figure-level legend (legend). Other Artists include figure-wide labels (suptitle, supxlabel, supylabel) and text (text). Finally, low-level Artists can be added directly using add_artist usually with care being taken to use the appropriate transform. Usually these include Figure.transFigure which ranges from 0 to 1 in each direction, and represents the fraction of the current Figure size, or Figure.dpi_scale_trans which will be in physical units of inches from the bottom left corner of the Figure (see Transformations Tutorial for more details).

保存图形#

最后,可以使用 savefig 方法将图形保存到磁盘。 fig.savefig('MyFigure.png', dpi=200) 会将 PNG 格式的图形以 200 点/英寸的分辨率保存到磁盘上当前目录中的 MyFigure.png 文件中。请注意,文件名可以包含指向文件系统中任何位置的相对路径或绝对路径。

支持多种类型的输出,包括 PNG、GIF、JPEG、TIFF 等光栅格式和 PDF、EPS、SVG 等矢量格式。

默认情况下,保存的图形大小由图形大小(以英寸为单位)和(对于光栅格式)dpi 设定。如果未设置dpi,则使用图形的dpi。请注意,如果图形包含已 栅格化 的艺术家,则dpi 仍然对 PDF 等矢量格式有意义;指定的dpi 将是栅格化对象的的分辨率。

可以使用 savefig 的bbox_inches 参数更改图形的大小。可以手动指定,单位仍为英寸。但是,最常见的用法是 bbox_inches='tight'。此选项会“紧密包裹”,根据需要修剪或扩展图形的大小,使其紧贴图形中的所有艺术家,并留出一个小填充,可通过pad_inches 指定,其默认值为 0.1 英寸。下图中的虚线框显示了如果在 savefig 中使用 bbox_inches='tight',将保存的图形部分。

( 代码, 2x.png, png)