创建好图表后,通常需要将其保存为文件以便在报告、网站或出版物中使用。
Matplotlib 提供了 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() 之前调用,否则保存的可能是空白图(在某些后端中)。Matplotlib 支持的格式取决于后端,常见格式包括:
| 参数 | 说明 | 示例 |
|---|---|---|
dpi | 分辨率(每英寸点数),默认100 | dpi=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' |
通过 dpi 和 figsize(创建 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)
默认保存的图像包含标题、轴标签等周围的空白区域。使用 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' 以获得紧凑的图像。对于需要叠加到其他背景上的图表,可以设置透明背景(PNG 和 SVG 支持):
plt.plot(x, y)
plt.savefig('transparent.png', transparent=True, bbox_inches='tight')
# 也可以用 facecolor 设置为 None 类似效果
同样使用 savefig 保存整个 Figure 对象:
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
# ... 在各个子图上绘图
fig.savefig('subplots.png', dpi=300, bbox_inches='tight')
如果需要在内存中处理图像(例如发送给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()
对于出版级图表,建议:
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') # 矢量版
对于 PDF 等格式,可以设置元数据如作者、标题:
plt.savefig('metadata.pdf',
metadata={'Title': '正弦曲线', 'Author': 'Matplotlib用户',
'Subject': '数学函数', 'Keywords': 'sin'})
通过 facecolor 和 edgecolor 控制:
plt.plot(x, y)
plt.savefig('yellow_bg.png', facecolor='yellow', edgecolor='red')
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()
bbox_inches='tight'。掌握保存图形的技巧后,你可以轻松地将 Matplotlib 图表集成到任何工作流中。下一章我们将介绍 Matplotlib 的配置系统,让你能够定制全局默认设置。