大家好,我是你们的博士学长。如果你已经跑通了上一期《第一张图:10行跑通并保存》 ,恭喜你,你已经进入了“真正会画图”的阶段。
但现实往往是:第一张图刚保存成功,下一秒就会被三件事狠狠干翻:
一是 标题一写中文,全变成“□□□”;
二是 负号显示成奇怪的短横,甚至直接丢失;
三是 图保存了,但你根本找不到文件在哪(或者路径报错)。
这三个坑几乎是“新手必踩套餐”。所以这一篇我不讲理论,直接给你最稳的解决方案:复制、改两行、立刻生效。
坑一:中文字体(方块/乱码/缺字)
你遇到的现象可能是这些:
中文标题显示成口口口:□□□;
明明能显示中文,但保存后乱码;
论文图要“Times New Roman + 中文”,结果混排崩掉。
背后的原因其实是:
Matplotlib 默认字体往往不包含中文字符,所以中文就会“找不到字形”。
最稳的解决办法(推荐:指定一个中文字体):
你只要在画图脚本最前面加上下面这段“通用配置”,就能解决80%情况:
import matplotlib as mplimport matplotlib.pyplot as plt# ===== 中文字体(选一个你电脑里有的)=====mpl.rcParams["font.sans-serif"] = ["SimHei"] # Windows常见:黑体mpl.rcParams["axes.unicode_minus"] = False # 负号问题(下面会解释)
然后你就可以正常写中文了:
plt.title("这是中文标题")plt.xlabel("横坐标标题")plt.ylabel("纵坐标标题")
如果你是 Windows,通常 SimHei(黑体)最稳。
如果你是 Mac,可能需要用 Arial Unicode MS 或系统中文字体。
你可以把 SimHei 换成以下常见字体之一:
Windows:Microsoft YaHei(微软雅黑)、SimSun(宋体)
macOS:PingFang SC(苹方)
Linux:WenQuanYi Micro Hei
坑二:负号(-)显示不对 / 变方块 / 丢失
常见现象:
y 轴有负数时,负号变成了一个怪怪的短横;
有时保存后负号消失;
坐标轴看起来“不专业”。
这是由于Matplotlib 默认会用 Unicode 负号(U+2212),但一些中文字体不支持或渲染异常,于是显示就不对。
解决方法:
import matplotlib as mplmpl.rcParams["axes.unicode_minus"] = False
这会让Matplotlib用普通的-号来显示负数。
坑三:路径(保存不到/找不到/报错/文件名非法)
这是真正让人崩溃的一类问题:
你以为保存了,结果图在哪?
或者直接报错:FileNotFoundError、OSError。
1)为什么你找不到保存的图片?
因为你用了相对路径:
它会保存到“当前工作目录”。在不同 IDE(VSCode/PyCharm/Jupyter)里,这个目录可能不一样。
最稳的办法:保存到你指定的绝对路径
plt.savefig(r"D:\py_figs\fig.png")
2)为什么会报 “No such file or directory”?
因为你指定的文件夹不存在,比如 D:\py_figs\ 没建。
解决:保存前自动创建文件夹
import osout_dir = r"D:\py_figs"os.makedirs(out_dir, exist_ok=True)plt.savefig(os.path.join(out_dir, "fig.png"), dpi=300, bbox_inches="tight")
3)Windows 路径最常见坑:反斜杠转义
比如:
\n会被当成换行符,路径就炸了。
稳妥写法有三种:
在字符串前加 r(推荐):r"D:\new\fig.png"
用双反斜杠:"D:\\new\\fig.png"
用正斜杠:"D:/new/fig.png"
4)文件名非法(尤其是中文标点/冒号)
Windows 文件名不能包含:<>:"/\|?*
所以像这种会炸:
建议写成:
"Fig1_result_compare.png"
一次性解决:
以后你每一篇画图脚本,都建议把下面这段放在最顶部——它几乎能把“中文/负号/路径”三大坑一次解决:
import osimport matplotlib as mplimport matplotlib.pyplot as plt# =====中文字体=====mpl.rcParams["font.sans-serif"] = ["SimHei"] # 或 Microsoft YaHei / PingFang SCmpl.rcParams["axes.unicode_minus"] = False #负号稳定显示# =====统一输出路径=====OUT_DIR = r"D:\py_figs"os.makedirs(OUT_DIR, exist_ok=True)# =====保存=====plt.savefig(os.path.join(OUT_DIR, "fig.png"), dpi=300, bbox_inches="tight")

中文字体、负号、路径这三件事看似细碎,但它们决定了你能不能“稳定出图”——把它们一次配置好,你后面的每一张图都会少掉大量无意义的折磨。