制作信息丰富的数据可视化是数据分析的重要组成部分,但它们的价值远不止于通常生成它们的交互式环境。为了分享您的成果,在报告中包含图形,或将它们嵌入演示文稿中,您需要将绘图保存到持久文件中。Matplotlib 提供简单的方法将图形导出为适合不同用途的多种格式。使用 savefig 保存图形Matplotlib 中保存绘图的主要函数是 plt.savefig()(在使用有状态的 pyplot API 时)或 figure.savefig()(在直接处理 Figure 对象时)。它最基本的用法只需要一个文件名,包括所需的文件扩展名,Matplotlib 通常会根据该扩展名推断输出格式。假设您已经创建了一个绘图,例如一个简单的折线图:import matplotlib.pyplot as plt import numpy as np # 示例数据 x = np.linspace(0, 10, 100) y = np.sin(x) # 创建绘图 fig, ax = plt.subplots() ax.plot(x, y) ax.set_title("Simple Sine Wave") ax.set_xlabel("X-axis") ax.set_ylabel("Y-axis") # 将绘图保存到文件 # 使用 Figure 对象的方法(推荐) fig.savefig("sine_wave_plot.png") # 另外,也可以使用 pyplot 的有状态接口(如果未捕获 fig/ax) # plt.savefig("sine_wave_plot.png") # 如果不再需要,保存后关闭绘图是好习惯 plt.close(fig)此代码片段生成一个简单的正弦波绘图,并将其保存为名为 sine_wave_plot.png 的 PNG 文件,存储在当前工作目录中。选择合适的文件格式Matplotlib 支持多种文件格式。选择何种格式取决于您打算如何使用保存的绘图:PNG (Portable Network Graphics): 一种栅格格式,非常适合网页使用和对可伸缩性要求不高的文档。它使用无损压缩并支持透明度。是在线显示清晰图形的良好默认选择。JPG/JPEG (Joint Photographic Experts Group): 另一种栅格格式,但它使用有损压缩。这会生成较小的文件大小,特别是对于照片图像,但可能会在线条图或文本中引入伪影。通常不推荐用于科学绘图,除非文件大小是重要限制。不支持透明度。PDF (Portable Document Format): 一种矢量格式(通常如此,除非它嵌入栅格图像)。保存为 PDF 的绘图可以无损缩放,非常适合包含在用于打印或高分辨率查看的文档中。PDF 绘图中的文本通常保持可搜索和可选择。SVG (Scalable Vector Graphics): 一种基于 XML 的矢量格式。与 PDF 类似,SVG 图像可以无损缩放,并且非常适合网页使用(受现代浏览器支持)以及在矢量图形软件(如 Inkscape 或 Adobe Illustrator)中编辑。EPS (Encapsulated PostScript): 一种在学术出版(特别是 LaTeX 工作流程)中曾普遍使用的矢量格式。现在普遍使用不如 PDF 或 SVG 常见。要保存为不同格式,只需更改文件名中的文件扩展名:# 保存为 PDF fig.savefig("sine_wave_plot.pdf") # 保存为 SVG fig.savefig("sine_wave_plot.svg")自定义保存输出savefig 函数提供多个参数来控制输出:dpi (每英寸点数): 控制栅格格式(如 PNG、JPG)的分辨率。更高的 DPI 意味着更高的分辨率和更大的文件大小。默认值通常为 100,但对于打印质量,300 或 600 等值很常见。# 保存高分辨率 PNG fig.savefig("sine_wave_plot_high_res.png", dpi=300)format: 显式指定输出格式,如果需要,可覆盖文件名扩展名。# 显式指定 PDF 格式 fig.savefig("sine_wave_output", format="pdf") # 保存为 sine_wave_output.pdftransparent: 如果设置为 True,绘图的背景(图形补丁,不包括坐标轴补丁,除非它们也设置为透明)将保存为透明。当将绘图叠加到其他内容上时,这对于 PNG 和 SVG 格式特别有用。fig.savefig("sine_wave_transparent.png", transparent=True)bbox_inches: 控制保存图形的边界框。设置 bbox_inches='tight' 非常有用,因为它会自动调整图形大小,只包含绘图元素(标题、标签、刻度、艺术元素),并去除图形周围多余的空白。# 保存时空白最少 fig.savefig("sine_wave_tight.png", bbox_inches='tight')facecolor、edgecolor: 您可以指定保存图形的背景颜色,这可能与显示颜色不同。# 保存为浅灰色背景 fig.savefig("sine_wave_gray_bg.png", facecolor='#e9ecef') # 使用浅灰色十六进制代码保存 Seaborn 绘图由于 Seaborn 函数通常基于 Matplotlib 对象(通常返回一个 Matplotlib Axes 对象),因此保存 Seaborn 绘图遵循相同的原则。如果 Seaborn 函数返回一个 Axes 对象,您可以访问其父 Figure 进行保存。对于返回 Seaborn FacetGrid 或类似对象的图形级函数,如 relplot、catplot、displot 或 pairplot,这些对象通常有一个指向底层 Matplotlib Figure 的 .figure 属性。import seaborn as sns import pandas as pd # 示例数据 data = pd.DataFrame({'x': x, 'y': y}) # 创建一个 Seaborn 绘图(返回 Axes) fig, ax = plt.subplots() # 首先创建图形和坐标轴 sns.lineplot(data=data, x='x', y='y', ax=ax) ax.set_title("Seaborn Line Plot") # 使用图形对象保存 fig.savefig("seaborn_lineplot.png", dpi=150, bbox_inches='tight') plt.close(fig) # 图形级函数示例(返回 FacetGrid) iris = sns.load_dataset("iris") g = sns.pairplot(iris, hue="species") # 使用 FacetGrid 的 figure 属性保存 g.figure.savefig("seaborn_pairplot.pdf", bbox_inches='tight') plt.close(g.figure) # 关闭底层图形最佳实践使用有意义的文件名: 为您保存的绘图选择描述性名称(例如,petal_length_vs_width_scatter.png 而不是 plot1.png)。组织您的绘图: 将绘图保存到项目结构中专门的目录(例如,results/figures/)中。文档优先选用矢量格式(PDF、SVG): 确保可缩放性和高质量,特别是对于打印。使用 bbox_inches='tight': 它几乎总能通过最小化不必要的空白来改善外观。考虑分辨率 (dpi): 为预期用途选择合适的 DPI(例如,网页使用 72-100,打印使用 300+)。保存后关闭绘图: 使用 plt.close(fig) 或 plt.close('all') 来释放内存,尤其是在脚本中生成大量绘图时。有效地保存您的可视化内容可确保从 Matplotlib 和 Seaborn 中获得的见解能够得以保留、分享,并融入到您的机器学习项目和报告的更广阔背景中。