根本办法是导出SVG或PDF等矢量格式,而非PNG/JPG位图;因矢量图靠路径描述、缩放无限清晰,而位图在高清屏上无论调高DPI都会因插值拉伸导致文字发虚、线条变粗、曲线锯齿。

直接导出 SVG 或 PDF 格式,而不是 PNG/JPG —— 这是解决“高清屏下模糊”的根本办法,和 DPI 设置无关。
为什么调高 dpi 对模糊没用?
在高清屏(如 MacBook Retina、Windows 200% 缩放)上截图或保存 PNG,即使设 dpi=600,本质仍是位图:像素点被强行拉伸或插值,文字边缘发虚、坐标轴线变粗、曲线锯齿明显。这不是分辨率不够,而是格式错了。
常见错误现象:
- 用
plt.savefig("fig.png", dpi=600)导出后,在 Word/PPT 里放大仍糊 - 导出的 PNG 插入 Visio 或 Illustrator 后无法编辑线条/文字
- Jupyter 中
%config InlineBackend.figure_format = 'retina'只影响 notebook 显示,不改变导出格式
plt.savefig() 导出 SVG 的正确写法
SVG 是纯矢量格式,靠路径和坐标描述图形,缩放无限清晰。Matplotlib 原生支持,无需额外依赖。
立即学习“Python免费学习笔记(深入)”;
实操建议:
- 文件名必须带
.svg后缀,或显式指定format="svg" - 完全忽略
dpi参数 —— SVG 不需要它,传了也无效 - 若图例在外侧(如
bbox_to_anchor=(1.05, 1)),务必加bbox_inches="tight",否则裁掉 - LaTeX 公式(如
r"$\alpha$")在 SVG 中正常渲染,无需额外配置
示例:
plt.plot([1, 2, 3], [1, 4, 9])
plt.xlabel(r"Time (s)")
plt.legend(["data"], bbox_to_anchor=(1.05, 1), loc="upper left")
plt.savefig("plot.svg", bbox_inches="tight")
PDF 也是矢量图,但要注意字体嵌入
PDF 同样是矢量格式,适合论文投稿;但默认可能引用系统字体,换设备打开时文字显示异常或替换为黑体。
关键设置:
- 启用
plt.rcParams["pdf.fonttype"] = 42(强制用 TrueType 字体) - 加上
plt.rcParams["ps.fonttype"] = 42(兼容旧版 Ghostscript) - 避免使用中文路径或含空格的文件名,PDF 导出易静默失败
导出命令只需一行:plt.savefig("plot.pdf", bbox_inches="tight")
Pyecharts / Plotly / Pygal 怎么办?
它们不是 Matplotlib,导出逻辑不同:
-
Pyecharts:默认 HTML 渲染,make_snapshot截图必糊;改用chart.render("out.html")+ 手动另存为 SVG(不推荐),或换用pygal -
Plotly:支持fig.write_image("plot.svg"),但需先装orca或kaleido(命令行工具,非纯 Python) -
Pygal:原生支持矢量,chart.render_to_file("plot.svg")一行搞定,无依赖、无坑
真正容易被忽略的是:不是所有“导出”按钮都生成矢量图。浏览器右键「图片另存为」得到的是 PNG,哪怕源是 SVG —— 因为浏览器已将其光栅化渲染。


















