必须用plt.savefig()显式控制DPI和尺寸:dpi=300适配印刷/论文,figsize=(8,6)需按内容量调整,务必加bbox_inches='tight'防截断,配合plt.close(fig)防内存泄漏,并优先使用Agg后端+PNG格式确保批量导出稳定。

用 plt.savefig() 控制DPI和尺寸,别依赖 plt.show()
直接调用 plt.show() 会弹窗、阻塞、且默认分辨率低(通常是100 DPI),完全不适合批量导出。必须用 plt.savefig() 显式控制输出质量。
关键参数不是“越高越好”,而是按需匹配使用场景:
-
dpi=300是印刷/论文常用底线,dpi=600适合细节密集的热力图或小字号标签 -
figsize=(8, 6)要提前设好——如果图表内容多(比如20+子图),得同步放大尺寸,否则文字会被压缩糊掉 - 务必加
bbox_inches='tight',否则坐标轴标签或图例可能被截断 - 避免在循环里反复调用
plt.figure()却不plt.close(),内存会持续增长,跑几百张图后大概率 OOM
保存前清空画布:用 plt.close(fig) 或上下文管理
很多人写循环绘图时只调用 plt.close(),这会关闭当前活跃 figure,但若中间有异常或 figure 创建逻辑复杂,容易漏关。更稳妥的是显式管理:
- 每次创建 figure 后保存完立刻
plt.close(fig),fig是plt.figure()返回的对象 - 或者用上下文方式:
with plt.rc_context({'figure.dpi': 300}): fig, ax = plt.subplots(figsize=(10, 6)) ax.plot(x, y) fig.savefig("chart.png", bbox_inches='tight') plt.close(fig) - 注意:
plt.clf()只清空当前 figure 内容,不释放内存;plt.close('all')会关所有 figure,但在多线程/子进程里可能误伤其他任务
批量导出时路径和文件名别硬编码,用 os.path.join() 和格式化
Windows 和 Linux 路径分隔符不同,直接拼字符串 "output/charts/" + name + ".png" 在 Windows 上会出错。必须用标准路径处理:
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
- 根目录用
os.path.join("output", "charts"),再配合os.makedirs(save_dir, exist_ok=True)确保目录存在 - 文件名含变量时,用
f"{prefix}_{i:04d}.png"保证排序正确(0001.png,0002.png),避免10.png排在2.png前面 - 中文路径或特殊字符(如括号、空格)在某些后端(如 Agg)下可能报
UnicodeEncodeError,可先用urllib.parse.quote()编码,或统一用英文命名
不同图表类型对后端和格式敏感,优先选 Agg + png 或 pdf
脚本运行在无 GUI 环境(如服务器、CI)时,Matplotlib 默认后端(如 TkAgg)会报 TclError 或卡死。必须提前切换:
- 在
import matplotlib.pyplot as plt前加import matplotlib; matplotlib.use('Agg') -
png兼容性最好,适合网页展示;pdf是矢量格式,缩放不失真,但部分图表(如带 rasterized 的热力图)导出 pdf 可能变大或渲染慢 - 避免用
jpeg:它不支持透明背景,且有损压缩,折线图上的细线可能出现色块噪点 - 如果图中用了 LaTeX 渲染公式(
r"$\alpha + \beta$"),确保系统已装texlive或启用usetex=False防止崩溃
批量保存高分辨率图真正卡点不在“怎么画”,而在资源清理、路径健壮性和后端适配。漏掉任意一个,跑着跑着就会静默失败——比如第 87 张图突然空白,或最后 30 张根本没生成。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










