图表介绍#

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, 2x.png, png)

在查看 Matplotlib 可视化时,您几乎总是在查看放置在 Figure 上的艺术家。在上面的示例中,图形是蓝色区域,add_subplotFigure 添加了一个 Axes 艺术家(参见 图形的部分)。一个更复杂的可视化可以在图形上添加多个 Axes、颜色条、图例、注释,并且 Axes 本身可以添加多个艺术家(例如 ax.plotax.imshow)。

查看图表#

我们将在下面更详细地讨论如何创建图形,但首先了解如何查看图形是有帮助的。这取决于你如何使用 Matplotlib,以及你使用的是哪种 后端

笔记本和集成开发环境#

使用内联后端在Jupyter Notebook中生成的图形图像。

一个 Jupyter Notebook 的截图,其中包含通过默认的 inline 后端生成的图形。#

如果你在使用一个笔记本(例如 Jupyter)或一个能渲染笔记本的IDE(如PyCharm、VSCode等),那么它们有一个后端会在执行代码单元时渲染Matplotlib图形。默认的Jupyter后端(%matplotlib inline)创建的静态图默认会裁剪或扩展图形大小,以在添加到图形的艺术家周围形成一个紧密的框(见下文 保存图形)。对于Jupyter中的交互式图形,你需要使用类似``%matplotlib widget``的ipython“魔法”来为``jupyter lab``或``notebook>=7``中的 ipympl 后端,或者为``notebook<7``或``nbclassic``中的Matplotlib notebook <jupyter_notebooks_jupyterlab>`使用``%matplotlib notebook`

备注

ipympl 后端是一个独立的包,请参阅 安装 ipympl

使用 Jupyter Notebook 的 notebook 后端生成的图表图像,包括一个工具栏。

通过 %matplotlib notebook 魔法生成的带有交互式图形的 Jupyter Notebook 截图。如果使用 JupyterLab,用户还应尝试类似的 widget 后端。#

参见

交互式图表

独立脚本和交互使用#

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

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

通过Python脚本生成的图形的截图,使用QtAgg后端显示。#

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

请注意,如果你在一个无法访问窗口系统的客户端上,图表将回退到使用“Agg”后端进行绘制,并且无法查看,尽管它可以被 保存

参见

交互式图表

创建图表#

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

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

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

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

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

(Source code, 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” 布局引擎。这些布局引擎会重新调整图形内的轴以防止刻度标签重叠,并尝试对齐轴,可以在许多常见情况下显著减少对图形上艺术家的手动调整。

添加艺术家#

Figure 类有许多方法用于向 FigureSubFigure 添加艺术家。到目前为止,最常见的是添加各种配置的 Axes(add_axesadd_subplotsubplotssubplot_mosaic)和子图(subfigures)。颜色条可以添加到 Axes 或 Axes 组中,位于 Figure 级别(colorbar)。也可以有一个 Figure 级别的图例(legend)。其他艺术家包括全图范围的标签(suptitlesupxlabelsupylabel)和文本(text)。最后,可以使用 add_artist 直接添加低级艺术家,通常需要注意使用适当的变换。通常这些包括 Figure.transFigure,它在每个方向上从 0 到 1 变化,表示当前 Figure 大小的分数,或者 Figure.dpi_scale_trans,它将以英寸为单位的物理单位从 Figure 的左下角开始(更多详情请参见 变换教程)。

保存图形#

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

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

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

可以使用 bbox_inches 参数来改变 Figure 的大小,该参数可以在 savefig 中使用。这个参数可以手动指定,单位为英寸。然而,到目前为止最常见的用法是 bbox_inches='tight'。这个选项会“紧缩包装”,根据需要修剪或扩展 Figure 的大小,使其紧密围绕 Figure 中的所有艺术家,并带有一个可以通过 pad_inches 指定的小边距,默认值为 0.1 英寸。下图中的虚线框显示了如果使用 bbox_inches='tight' 在 savefig 中保存时,Figure 的哪部分将被保存。

(Source code, 2x.png, png)