Matplotlib 全面使用指南 -- 图形介绍 Introduction to Figures

发布于:2025-07-10 ⋅ 阅读:(20) ⋅ 点赞:(0)

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。

Matplotlib

图形介绍

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)

img

当我们查看 Matplotlib 可视化内容时,几乎总是会看到放置在 Figure 上的 Artist。在上面的例子中,图形是蓝色区域,而 add_subplotFigure 中添加了一个 Axes 艺术家(见图形的组成部分)。更复杂的可视化可以向图形中添加多个轴、颜色条、图例、注释,而轴本身也可以添加多个艺术家(例如 ax.plotax.imshow)。

查看图形

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

笔记本和集成开发环境

img

Jupyter Notebook 的截图,通过默认的内联后端生成图形。

如果你正在使用笔记本(例如 Jupyter)或支持笔记本的集成开发环境(PyCharm、VSCode 等),它们会有一个后端,当代码单元格执行时会渲染 Matplotlib 图形。默认的 Jupyter 后端(%matplotlib inline)会创建静态图形,默认情况下会裁剪或扩展图形大小,使其紧密围绕添加到图形中的艺术家(见保存图形,下文)。如果需要在 Jupyter 中使用交互式图形,则需要使用 ipython“魔法”命令,例如在 JupyterLab 或 notebook>=7 中使用 [ipympl](https://matplotlib.org/ipympl/) 后端的 %matplotlib widget,或者在 notebook<7nbclassic 中使用 Matplotlib 笔记本%matplotlib notebook

注意:ipympl 后端位于单独的包中,请参阅安装 ipympl

img

通过 %matplotlib notebook 魔法命令生成的交互式图形的 Jupyter Notebook 截图。用户也可以尝试在 JupyterLab 中使用类似的 widget 后端。

另请参阅:交互式图表。

独立脚本和交互式使用

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

img

通过 Python 脚本生成并通过 QtAgg 后端显示的图形的截图。

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

请注意,如果你的客户端没有访问窗口系统的权限,图形将回退到使用“Agg”后端绘制,无法查看,但可以保存

另请参阅:交互式图表。

创建图形

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

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

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

(Source code)

img

更复杂的网格可以通过 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)

img

有时我们希望在一个图形中有一个嵌套布局,包含两个或多个不共享相同子图网格的轴集合。我们可以使用 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)

img

不使用 pyplot 接口直接实例化 Figure 对象也是可能的。这通常只有在你想创建自己的 GUI 应用程序或服务,并且不希望携带 pyplot 全局状态时才需要。有关如何做到这一点的示例,请参阅将 Matplotlib 嵌入图形用户界面中的嵌入示例。

图形选项

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

facecoloredgecolorlinewidthframeon 选项都会以预期的方式改变图形的外观,其中 frameon 如果设置为 False,会使图形透明。

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

添加艺术家

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

保存图形

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

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

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

可以使用 savefigbbox_inches 参数更改图形的大小。这可以手动指定,同样以英寸为单位。然而,最常用的选项是 bbox_inches='tight'。此选项会“收缩包装”,根据需要裁剪或扩展图形大小,使其紧密围绕图形中的所有艺术家,并且可以指定一个小的填充,由 pad_inches 设置,默认为 0.1 英寸。下面的图形中的虚线框显示了如果在 savefig 中使用 bbox_inches='tight',将保存图形的哪一部分。

(Source code)

img

风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。


网站公告

今日签到

点亮在社区的每一天
去签到