文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。
图形介绍
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
上的 Artist
。在上面的例子中,图形是蓝色区域,而 add_subplot
在 Figure
中添加了一个 Axes
艺术家(见图形的组成部分)。更复杂的可视化可以向图形中添加多个轴、颜色条、图例、注释,而轴本身也可以添加多个艺术家(例如 ax.plot
或 ax.imshow
)。
查看图形
我们将在下面更详细地讨论如何创建图形,但首先了解如何查看图形是有帮助的。这取决于你如何使用 Matplotlib 以及你使用的后端是什么。
笔记本和集成开发环境
Jupyter Notebook 的截图,通过默认的内联后端生成图形。
如果你正在使用笔记本(例如 Jupyter)或支持笔记本的集成开发环境(PyCharm、VSCode 等),它们会有一个后端,当代码单元格执行时会渲染 Matplotlib 图形。默认的 Jupyter 后端(%matplotlib inline
)会创建静态图形,默认情况下会裁剪或扩展图形大小,使其紧密围绕添加到图形中的艺术家(见保存图形,下文)。如果需要在 Jupyter 中使用交互式图形,则需要使用 ipython“魔法”命令,例如在 JupyterLab 或 notebook>=7
中使用 [ipympl](https://matplotlib.org/ipympl/)
后端的 %matplotlib widget
,或者在 notebook<7
或 nbclassic
中使用 Matplotlib 笔记本的 %matplotlib notebook
。
注意:ipympl 后端位于单独的包中,请参阅安装 ipympl。
通过 %matplotlib notebook
魔法命令生成的交互式图形的 Jupyter Notebook 截图。用户也可以尝试在 JupyterLab 中使用类似的 widget 后端。
独立脚本和交互式使用
如果用户在具有窗口系统的客户端上,可以使用许多后端将图形渲染到屏幕上,通常使用 Python 的 Qt、Tk 或 Wx 工具包,或者原生的 MacOS 后端。这些后端通常在用户的 matplotlibrc 中选择,或者通过在会话或脚本开始时调用例如 matplotlib.use('QtAgg')
来选择。
通过 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')
更复杂的网格可以通过 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')
有时我们希望在一个图形中有一个嵌套布局,包含两个或多个不共享相同子图网格的轴集合。我们可以使用 add_subfigure
或 subfigures
在父图形中创建虚拟图形;更多详细信息请参阅图形子图形。
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')
不使用 pyplot 接口直接实例化 Figure
对象也是可能的。这通常只有在你想创建自己的 GUI 应用程序或服务,并且不希望携带 pyplot 全局状态时才需要。有关如何做到这一点的示例,请参阅将 Matplotlib 嵌入图形用户界面中的嵌入示例。
图形选项
创建图形时有一些可用选项。图形在屏幕上的大小由 figsize 和 dpi 设置。figsize 是图形的 (宽度, 高度)
,以英寸为单位(或者,如果愿意,也可以使用 72 印刷点为单位)。dpi 是图形每英寸的像素数。为了使图形在屏幕上以你请求的物理大小显示,你应该将 dpi 设置为与你的图形系统相同的 dpi。请注意,许多图形系统现在使用“dpi 比率”来指定有多少屏幕像素用于表示图形像素。Matplotlib 会将 dpi 比率应用于传递给图形的 dpi,以使其具有更高的分辨率,因此你应该将较低的数字传递给图形。
facecolor、edgecolor、linewidth 和 frameon 选项都会以预期的方式改变图形的外观,其中 frameon 如果设置为 False,会使图形透明。
最后,用户可以使用 layout 参数为图形指定布局引擎。目前 Matplotlib 提供了“constrained”、“compressed”和“tight”布局引擎。这些引擎会重新调整图形内的轴,以防止刻度标签重叠,并尝试对齐轴,这可以为许多常见情况节省大量的手动调整图形上艺术家的时间。
添加艺术家
Figure
类有许多方法可以将艺术家添加到 Figure
或 SubFigure
中。其中最常见的是添加各种配置的轴(add_axes
、add_subplot
、subplots
、subplot_mosaic
)和子图形(subfigures
)。颜色条可以在图形级别添加到轴或一组轴中(colorbar
)。还可以添加图形级别的图例(legend
)。其他艺术家包括图形范围的标签(suptitle
、supxlabel
、supylabel
)和文本(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 将是光栅化对象的分辨率。
可以使用 savefig
的 bbox_inches 参数更改图形的大小。这可以手动指定,同样以英寸为单位。然而,最常用的选项是 bbox_inches='tight'
。此选项会“收缩包装”,根据需要裁剪或扩展图形大小,使其紧密围绕图形中的所有艺术家,并且可以指定一个小的填充,由 pad_inches 设置,默认为 0.1 英寸。下面的图形中的虚线框显示了如果在 savefig
中使用 bbox_inches='tight'
,将保存图形的哪一部分。
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。