使用 Matplotlib 做科研绘图时,经常需要在标题、坐标轴、图例或注释里显示中文。Windows 通常已经自带中文字体,配置比较简单;Linux 环境则需要先确认系统里是否安装了可用的中文字体。
目录
Windows 配置
Windows 一般自带微软雅黑、黑体等中文字体。可以在绘图代码开头添加:
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["Microsoft YaHei", "SimHei"]
plt.rcParams["axes.unicode_minus"] = False
这里有两个设置:
font.sans-serif:指定优先使用的无衬线字体列表。axes.unicode_minus:避免坐标轴负号显示成方块。
Linux 安装中文字体
在 Ubuntu/Debian 系统中,优先推荐安装发行版维护的中文字体包:
sudo apt update
sudo apt install fonts-noto-cjk
fc-cache -fv
安装完成后,可以检查字体是否可用:
fc-match "Noto Sans CJK SC"
然后在 Python 中指定字体:
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["Noto Sans CJK SC", "Noto Sans SC", "SimHei"]
plt.rcParams["axes.unicode_minus"] = False
指定字体文件路径
如果你通过第三方字体仓库或手动方式安装了字体,也可以直接指定字体文件。例如字体文件位于 /usr/share/fonts/MyFonts/simhei.ttf:
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
font_path = "/usr/share/fonts/MyFonts/simhei.ttf"
font_prop = fm.FontProperties(fname=font_path)
plt.rcParams["font.family"] = font_prop.get_name()
plt.rcParams["axes.unicode_minus"] = False
这种方式适合字体已经存在,但 Matplotlib 没有自动匹配到字体名称的情况。
清理 Matplotlib 字体缓存
如果确认系统已经安装中文字体,但图里仍然显示方块,可能是 Matplotlib 的字体缓存没有刷新。可以删除缓存后重新运行脚本:
rm -rf ~/.cache/matplotlib
下次运行 Matplotlib 时,它会重新扫描系统字体。
最小测试代码
可以用下面这段代码快速验证中文和负号是否正常显示:
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["Noto Sans CJK SC", "Microsoft YaHei", "SimHei"]
plt.rcParams["axes.unicode_minus"] = False
x = [-3, -2, -1, 0, 1, 2, 3]
y = [i**2 for i in x]
plt.plot(x, y, label="二次函数")
plt.title("Matplotlib 中文显示测试")
plt.xlabel("横轴")
plt.ylabel("纵轴")
plt.legend()
plt.show()
如果标题、坐标轴、图例和负号都正常显示,说明中文字体配置已经生效。