输出与保存:保存图形

创建好图表后,通常需要将其保存为文件以便在报告、网站或出版物中使用。 Matplotlib 提供了 savefig() 函数,支持多种格式和灵活的配置选项, 让你可以精确控制输出图像的质量、尺寸和外观。

💾 1. 基本保存:plt.savefig()

最简单的用法是在 show() 之前调用 savefig(),传入文件名即可。文件扩展名决定格式:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.plot(x, y)
plt.title('正弦曲线')
plt.savefig('sin_plot.png')   # 保存为PNG
# plt.savefig('sin_plot.pdf') # 保存为PDF
# plt.savefig('sin_plot.svg') # 保存为SVG
plt.show()  # 显示(可选)
✔️ savefig() 应在 show() 之前调用,否则保存的可能是空白图(在某些后端中)。

📁 2. 支持的图像格式

Matplotlib 支持的格式取决于后端,常见格式包括:

  • PNG:光栅格式,适合网页,支持透明背景
  • PDF:矢量格式,适合出版和打印
  • SVG:矢量格式,适合网页和进一步编辑
  • EPS:封装PostScript,适合LaTeX
  • PS:PostScript
  • JPG/JPEG:有损压缩,不推荐用于图表(会模糊)
  • TIFF:标签图像格式
  • WebP:现代格式,较小体积
建议: 对于大多数用途,PNG 或 PDF 是最佳选择。需要矢量图时用 PDF 或 SVG。

⚙️ 3. savefig 常用参数

参数说明示例
dpi分辨率(每英寸点数),默认100dpi=300 高清
bbox_inches指定保存的区域,'tight' 会自动裁去空白bbox_inches='tight'
pad_inches当 bbox_inches='tight' 时,额外填充的英寸数pad_inches=0.1
transparent是否透明背景(仅某些格式支持)transparent=True
facecolor图形背景色,默认 'white'facecolor='lightgray'
edgecolor边框颜色edgecolor='black'
format强制指定格式,否则从扩展名推断format='png'

📐 4. 控制分辨率和尺寸

通过 dpifigsize(创建 figure 时设置)控制输出图像的像素尺寸:

# 创建 8x6 英寸的图形,dpi=100 则输出 800x600 像素
fig = plt.figure(figsize=(8, 6))
plt.plot(x, y)
plt.savefig('output.png', dpi=100)   # 800x600

# 相同 figsize,dpi=300 则输出 2400x1800 像素(高清)
plt.savefig('output_hd.png', dpi=300)

✂️ 5. 裁掉多余空白:bbox_inches='tight'

默认保存的图像包含标题、轴标签等周围的空白区域。使用 bbox_inches='tight' 自动裁剪到最紧的边界:

plt.plot(x, y)
plt.title('带标题的图')
plt.xlabel('x')
plt.ylabel('y')
plt.savefig('with_white.png')                 # 默认有较多空白
plt.savefig('tight.png', bbox_inches='tight') # 裁剪空白
✔️ 推荐始终使用 bbox_inches='tight' 以获得紧凑的图像。

🔲 6. 透明背景

对于需要叠加到其他背景上的图表,可以设置透明背景(PNG 和 SVG 支持):

plt.plot(x, y)
plt.savefig('transparent.png', transparent=True, bbox_inches='tight')
# 也可以用 facecolor 设置为 None 类似效果

🔲 7. 保存包含子图的图形

同样使用 savefig 保存整个 Figure 对象:

fig, axes = plt.subplots(2, 2, figsize=(10, 8))
# ... 在各个子图上绘图
fig.savefig('subplots.png', dpi=300, bbox_inches='tight')

🧠 8. 保存到内存(BytesIO)

如果需要在内存中处理图像(例如发送给Web应用),可以使用 BytesIO

from io import BytesIO

buf = BytesIO()
plt.savefig(buf, format='png', dpi=100, bbox_inches='tight')
buf.seek(0)
# 现在 buf 可以作为文件对象使用,例如传递给 PIL 或 base64 编码
image_data = buf.getvalue()
buf.close()

✨ 9. 优化图片质量

对于出版级图表,建议:

  • 使用矢量格式(PDF、SVG),无限放大不失真。
  • 如果必须用光栅图(PNG),设置高 DPI(300 或更高)。
  • 使用 bbox_inches='tight' 去除多余空白。
  • 设置合适的 figsize 避免文字过小。
plt.figure(figsize=(8, 6))
plt.plot(x, y)
plt.title('高质量图表')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.savefig('high_quality.png', dpi=300, bbox_inches='tight', pad_inches=0.1)
plt.savefig('high_quality.pdf', bbox_inches='tight')  # 矢量版

📝 10. 设置图像元数据(PDF 等)

对于 PDF 等格式,可以设置元数据如作者、标题:

plt.savefig('metadata.pdf',
            metadata={'Title': '正弦曲线', 'Author': 'Matplotlib用户',
                      'Subject': '数学函数', 'Keywords': 'sin'})

🎨 11. 保存时指定画布颜色

通过 facecoloredgecolor 控制:

plt.plot(x, y)
plt.savefig('yellow_bg.png', facecolor='yellow', edgecolor='red')

🏆 12. 综合示例:导出出版级图表

import matplotlib.pyplot as plt
import numpy as np

# 生成数据
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

# 创建图形(适合双栏排版的大小)
fig, ax = plt.subplots(figsize=(3.5, 2.5))  # 英寸

# 绘制并美化
ax.plot(x, y, 'b-', linewidth=1)
ax.set_xlabel('x (rad)')
ax.set_ylabel('sin(x)')
ax.set_title('正弦函数', fontsize=10)
ax.grid(True, linestyle=':', alpha=0.7)

# 保存为高分辨率PNG和PDF
plt.savefig('publication.png', dpi=600, bbox_inches='tight', pad_inches=0.05)
plt.savefig('publication.pdf', bbox_inches='tight')
plt.show()
✔️ 对于论文投稿,通常需要 300-600 DPI 的 TIFF 或 EPS,但 PDF 更为通用。

❓ 13. 常见问题

  • 保存的图片文字模糊:提高 DPI,或使用矢量格式。
  • 保存后空白过多:使用 bbox_inches='tight'
  • 中文显示方框:参考“安装与配置”章节设置中文字体。
  • savefig 后 show() 显示空白:某些后端中 savefig 会清空图形,建议先 savefig 再 show,或保持交互。

掌握保存图形的技巧后,你可以轻松地将 Matplotlib 图表集成到任何工作流中。下一章我们将介绍 Matplotlib 的配置系统,让你能够定制全局默认设置。