图形简介#
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')
在查看 Matplotlib 可视化时,您几乎总是在查看放置在Figure
上的艺术家 (Artists)。在上面的示例中,图形是蓝色区域,add_subplot
已将一个 Axes
艺术家添加到了 Figure
(参见图形的组成部分)。更复杂的可视化可以将多个坐标轴添加到图形、颜色条、图例和注释中,并且坐标轴本身可以添加多个艺术家 (Artists)(例如,ax.plot
或 ax.imshow
)。
查看图形#
我们将在下面更详细地讨论如何创建图形,但首先了解如何查看图形很有帮助。这取决于您如何使用 Matplotlib 以及您正在使用的后端。
笔记本和 IDE#
如果您正在使用笔记本(例如Jupyter)或渲染笔记本的 IDE(PyCharm、VSCode 等),那么它们都有一个后端,当执行代码单元格时会渲染 Matplotlib 图形。默认的 Jupyter 后端(%matplotlib inline
)创建静态图,默认情况下会修剪或扩展图形大小,使其在添加到图形的艺术家周围有一个紧密的框(请参阅下面的保存图形)。对于 Jupyter 中的交互式图,您将需要使用 ipython“魔法”,例如 %matplotlib widget
,用于 jupyter lab
或 notebook>=7
中的 ipympl 后端,或 %matplotlib notebook
,用于 notebook<7
或 nbclassic
中的 Matplotlib 笔记本。
另请参阅
独立脚本和交互式使用#
如果用户在具有窗口系统的客户端上,则可以使用许多后端将图形渲染到屏幕上,通常使用 Python Qt、Tk 或 Wx 工具包,或本机 MacOS 后端。这些通常在用户的matplotlibrc 中选择,或者在会话或脚本的开头调用,例如 matplotlib.use('QtAgg')
。
从脚本或交互式方式(例如,从IPython shell)运行时,图形将不会显示,直到我们调用 plt.show()
。图形将出现在新的 GUI 窗口中,通常会有一个工具栏,其中包含用于与图形交互的缩放、平移和其他工具。默认情况下,plt.show()
会阻止脚本或 shell 的进一步交互,直到图形窗口关闭,尽管可以出于某些目的将其关闭。有关更多详细信息,请参阅交互模式。
请注意,如果您在无法访问窗口系统的客户端上,则图形将回退为使用“Agg”后端绘制,并且无法查看,但可以保存。
另请参阅
创建图形#
到目前为止,创建图形最常见的方法是使用 pyplot 接口。如Matplotlib 应用程序接口 (API) 中所述,pyplot 接口有两个用途。一是启动后端并跟踪 GUI 窗口。另一个是坐标轴和艺术家的全局状态,允许使用绘图方法的简短形式 API。在上面的示例中,我们将 pyplot 用于第一个目的,并创建图形对象 fig
。作为副作用,fig
也会添加到 pyplot 的全局状态,并且可以通过 gcf
访问。
用户通常在创建图形时需要一个坐标轴或坐标轴网格,因此除了 figure
之外,还有一些方便的方法可以同时返回图形和一些坐标轴。可以使用 pyplot.subplots
(它只是简单地包装了 Figure.subplots
)来实现简单的坐标轴网格。
fig, axs = plt.subplots(2, 2, figsize=(4, 3), layout='constrained')
更复杂的网格可以使用 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')
有时,我们希望在 Figure 中有一个嵌套布局,其中两组或多组 Axes 不共享同一个子图网格。我们可以使用 add_subfigure
或 subfigures
在父 Figure 中创建虚拟的 Figure;有关更多详细信息,请参阅 Figure 子图。
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')
可以直接实例化 Figure
实例,而无需使用 pyplot 接口。如果您想要创建自己的 GUI 应用程序或不希望携带 pyplot 全局状态的服务,通常才需要这样做。有关如何执行此操作的示例,请参阅 在图形用户界面中嵌入 Matplotlib 中的嵌入示例。
Figure 选项#
创建 Figure 时有一些可用选项。屏幕上的 Figure 大小由 figsize 和 dpi 设置。figsize 是 Figure 的 (宽度, 高度)
,单位为英寸(或者,如果愿意,可以使用 72 印刷点的单位)。dpi 是 Figure 将被渲染的每英寸像素数。为了使您的 Figure 在屏幕上以您请求的物理尺寸显示,您应该将 dpi 设置为与您的图形系统相同的 dpi。请注意,许多图形系统现在使用“dpi 比率”来指定使用多少屏幕像素来表示一个图形像素。Matplotlib 将 dpi 比率应用于传递给 Figure 的 dpi,使其具有更高的分辨率,因此您应该将较低的数字传递给 Figure。
facecolor、edgecolor、linewidth 和 frameon 选项都以预期的方式更改 Figure 的外观,如果将 frameon 设置为 False,则使 Figure 透明。
最后,用户可以使用 layout 参数为 Figure 指定一个布局引擎。目前,Matplotlib 提供了 “constrained”、“compressed” 和 “tight” 布局引擎。这些引擎会缩放 Figure 内的轴以防止刻度标签重叠,并尝试对齐轴,并且可以为许多常见情况节省大量手动调整 Figure 上的艺术家的时间。
添加艺术家#
Figure
类有许多方法可以将艺术家添加到 Figure
或 SubFigure
。到目前为止,最常见的是添加各种配置的轴(add_axes
、add_subplot
、subplots
、subplot_mosaic
)和子图 (subfigures
)。颜色条会在 Figure 级别添加到 Axes 或 Axes 组 (colorbar
)。也可以拥有一个 Figure 级别的图例 (legend
)。其他艺术家包括 Figure 范围的标签 (suptitle
、supxlabel
、supylabel
) 和文本 (text
)。最后,可以使用 add_artist
直接添加低级艺术家,通常要注意使用适当的变换。通常这些包括 Figure.transFigure
,其范围在每个方向上从 0 到 1,表示当前 Figure 大小的分数,或 Figure.dpi_scale_trans
,它将以英寸为单位,从 Figure 的左下角开始(有关更多详细信息,请参阅 变换教程)。
保存 Figure#
最后,可以使用 savefig
方法将 Figure 保存到磁盘。fig.savefig('MyFigure.png', dpi=200)
将以 200 点/英寸的分辨率,将 PNG 格式的 Figure 保存到磁盘上当前目录中的文件 MyFigure.png
。请注意,文件名可以包含文件系统上任何位置的相对或绝对路径。
支持多种类型的输出,包括 PNG、GIF、JPEG、TIFF 等光栅格式以及 PDF、EPS 和 SVG 等矢量格式。
默认情况下,保存的 Figure 的大小由 Figure 大小(英寸)和光栅格式的 dpi 设置。如果未设置 dpi,则使用 Figure 的 dpi。请注意,如果 Figure 包括已被 栅格化 的艺术家,则 dpi 对于 PDF 等矢量格式仍然有意义;指定的 dpi 将是栅格化对象的分辨率。
可以使用 savefig 的 bbox_inches 参数更改 Figure 的大小。这可以手动指定,单位仍然是英寸。但是,到目前为止最常见的用法是 bbox_inches='tight'
。此选项会“收缩包裹”,根据需要修剪或扩展 Figure 的大小,使其紧贴 Figure 中的所有艺术家,并留有小的填充,可以使用 pad_inches 指定,默认为 0.1 英寸。下图中的虚线框显示了如果在 savefig 中使用 bbox_inches='tight'
时将保存的 Figure 部分。