Figure简介#

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

(Source code, png)

在查看 Matplotlib 可视化时,您几乎总是在查看放置在 Figure 上的 Artist.在上面的示例中,figure是蓝色区域,并且 add_subplotAxes artist 添加到了 Figure (参见 Figure 的组成部分 ). 更复杂的可视化可以将多个 Axes 添加到 Figure,颜色条,图例和注释中,并且 Axes 本身可以添加多个 Artists (例如 ax.plotax.imshow ).

查看Figure#

我们将在下面更详细地讨论如何创建 Figures,但首先了解如何查看 Figure 会很有帮助.这取决于您如何使用 Matplotlib,以及您使用的 Backend .

Notebook和IDE#

在带有inline backend的Jupyter Notebook中生成的figure图像.

Jupyter Notebook 的屏幕截图,并通过默认的 inline backend 生成图形.#

如果您使用的是 Notebook (例如 Jupyter ) 或渲染 Notebook 的 IDE (PyCharm, VSCode 等),那么它们有一个 backend,当执行代码单元时,它将渲染 Matplotlib Figure. 默认的 Jupyter backend ( %matplotlib inline ) 创建静态图,默认情况下,它们会裁剪或展开 figure 大小,以便在添加到 Figure 的 Artist 周围有一个紧密的框 (请参见下面的 保存图形 ). 对于 Jupyter 中的交互式图,您需要使用 IPython "magic",例如 %matplotlib widget (对于 ipympl backend 在 jupyter labnotebook>=7 中) 或者 %matplotlib notebook (对于 Matplotlib notebooknotebook<7nbclassic 中).

备注

ipympl backend 位于一个单独的包中,请参见 Installing ipympl .

在带有notebook backend的Jupyter Notebook中生成的figure图像,包括工具栏.

Jupyter Notebook 的屏幕截图,其中包含通过 %matplotlib notebook magic 生成的交互式图形.如果使用 widget ,用户还应尝试类似的 JupyterLab backend.#

参见

交互式图形 .

独立脚本和交互使用#

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

从脚本通过 QtAgg 后端生成的图形的图像.

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

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

请注意,如果您在无法访问窗口系统的客户端上,图形将回退到使用"Agg"后端绘制,并且无法查看,但可以 saved .

参见

交互式图形 .

创建图形#

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

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

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

(Source code, 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')

(Source code, png)

有时我们希望在图形中有一个嵌套布局,其中两组或更多组 Axes 不共享同一个子图网格.我们可以使用 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')

(Source code, png)

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

图形选项#

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

facecolor,edgecolor,linewidth 和 frameon 选项都以预期的方式更改图形的外观,如果将 frameon 设置为 False,则使图形透明.

最后,用户可以使用 layout 参数指定图形的布局引擎.目前,Matplotlib 提供了 "constrained" , "compressed""tight" 布局引擎.这些引擎会重新缩放 Figure 中的坐标轴,以防止刻度标签重叠,并尝试对齐坐标轴,从而可以在许多常见情况下节省大量手动调整 Figure 上的 Artist 的操作.

添加 Artist#

Figure 类有许多方法可以将 Artist 添加到 FigureSubFigure .到目前为止,最常见的方法是添加各种配置的 Axes( add_axes , add_subplot , subplots , subplot_mosaic )和子图 ( subfigures ).颜色条被添加到 Figure 级别的 Axes 或 Axes 组( colorbar ).也可以拥有 Figure 级别的图例 ( legend ).其他 Artist 包括整个图形的标签( suptitle , supxlabel , supylabel )和文本( text ).最后,可以使用 add_artist 直接添加底层 Artist,通常需要注意使用适当的变换.通常,这些变换包括 Figure.transFigure ,其范围在每个方向上从 0 到 1,表示当前 Figure 大小的分数,或者 Figure.dpi_scale_trans ,它将是 Figure 左下角开始的物理单位的英寸(有关更多详细信息,请参见 转换教程 ).

保存图形#

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

支持多种输出类型,包括 PNG,GIF,JPEG,TIFF 等栅格格式,以及 PDF,EPS 和 SVG 等矢量格式.

默认情况下,保存的 Figure 的大小由 Figure 的大小(以英寸为单位)以及栅格格式的 dpi 决定.如果未设置 dpi,则使用 Figure 的 dpi.请注意,如果 Figure 包含已 rasterized 的 Artist,则 dpi 仍然对 PDF 等矢量格式有意义;指定的 dpi 将是栅格化对象的分辨率.

可以使用 savefig 的 bbox_inches 参数来更改 Figure 的大小.可以手动指定此参数,同样以英寸为单位.但是,到目前为止,最常见的用法是 bbox_inches='tight' .此选项"shrink-wraps",根据需要修剪或扩展图形的大小,使其紧密地围绕图形中的所有 Artist,并留有一个可以由 pad_inches 指定的小填充,默认为 0.1 英寸.下图中的虚线框显示了如果在 savefig 中使用 bbox_inches='tight' 将保存的图形部分.

(Source code, png)