问题背景
Matplotlib 默认字体不包含中文字形,在图表标题、坐标轴标签中使用中文时会出现方块或警告。常见做法是修改全局rcParams,但这依赖系统已安装对应字体,换台机器就可能失效。本文介绍一种更可控的方式:将字体文件放在项目目录内,通过font_manager.fontManager.addfont在当前进程中注册,无需修改系统字体。
环境与前置条件
| 项目 | 版本/说明 |
|---|---|
| Python | 3.10.13 |
| Matplotlib | 3.10.8 |
| 字体 | LXGW WenKai Lite TTF Version 1.530 |
| 实测系统 | macOS 27.0.1 arm64 |
Windows 和 Linux 用户可参照相同目录结构,本文未在这两个系统上实测。下面的 python 应指向你实际使用的解释器;使用虚拟环境时,先激活对应环境。安装本次示例的依赖:
python-mpipinstall"matplotlib==3.10.8"字体获取与项目目录
霞鹜文楷轻便版是开源中文字体,适合正文排版与图表标注。请从作者项目仓库的fonts/TTF/目录下载LXGWWenKaiLite-Regular.ttf(约 13.3 MiB,Version 1.530)。下载字体文件不等于安装系统字体,本文仅将其作为项目资源使用。
从作者 TTF 目录取得字体,同时保留仓库的 OFL.txt。整理字体资料时,一起记录来源、版本、实际文件路径与许可文件,方便项目迁移后复核。
将字体放入与脚本同级的fonts目录:
project/ ├── demo.py └── fonts/ └── LXGWWenKaiLite-Regular.ttf完整可运行示例
以下为demo.py完整代码,可直接运行:
frompathlibimportPathimportmatplotlib matplotlib.use("Agg")# 命令行导出图片,不依赖桌面显示器importmatplotlib.pyplotaspltfrommatplotlibimportfont_manager base=Path(__file__).resolve().parent font_path=base/"fonts"/"LXGWWenKaiLite-Regular.ttf"ifnotfont_path.is_file():raiseFileNotFoundError(f"请把字体文件放到:{font_path}")font_manager.fontManager.addfont(str(font_path))family=font_manager.FontProperties(fname=str(font_path)).get_name()withplt.rc_context({"font.family":family,"axes.unicode_minus":True}):fig,ax=plt.subplots(figsize=(8,4.5),layout="constrained")ax.plot([1,2,3],[-2,1,3],marker="o",color="#2f60c8")ax.set_title("项目内字体:中文图表验证",fontsize=18)ax.set_xlabel("月份")ax.set_ylabel("变化值(示例数据)")ax.set_xticks([1,2,3],["一月","二月","三月"])ax.axhline(0,color="#aab3c4",linewidth=0.8)ax.grid(alpha=0.2)output=base/"中文图表.png"fig.savefig(output,dpi=160)plt.close(fig)print("Matplotlib:",matplotlib.__version__)print("Font family:",family)print("Font file:",font_manager.findfont(family,fallback_to_default=False))print("Output:",output)Jupyter 环境注意
Path(__file__)在 Jupyter Notebook 中不可用,可改用Path.cwd()并确认当前工作目录包含fonts/子目录:
base=Path.cwd()font_path=base/"fonts"/"LXGWWenKaiLite-Regular.ttf"运行与结果
cdproject python demo.py本次实际运行打印 Matplotlib 3.10.8、Font family: LXGW WenKai Lite,Font file 指向项目内的字体文件,Output 指向脚本目录下的中文图表.png。示例使用 Agg 后端直接保存文件,不会弹出窗口。findfont(family, fallback_to_default=False) 用于检查实际匹配路径;同一进程内有其他同名字体版本时,也请核对路径是否符合预期。
生成的中文图表.png(1280×720 像素)中,标题、坐标轴标签均为中文正常显示,负数-2的负号也正确渲染,无 Glyph 缺字警告。折线数据只用于显示验证,不代表业务指标。
常见问题
addfont 是否永久生效?
不是。addfont仅对当前 Python 进程有效,每次新启动解释器或重启内核后需重新执行注册代码。
为什么用 rc_context 而不是直接改 rcParams?
rc_context是上下文管理器,退出后恢复原设置,避免污染后续绘图的全局配置。
出现 Glyph missing 警告怎么办?
说明所用字体缺少对应字形。霞鹜文楷轻便版为 Lite 子集,生僻字可能未覆盖,需另选完整字库或换用其他字体。
Windows/Linux 路径有区别吗?
pathlib.Path本身跨平台,只要目录结构一致,代码无需修改。但本文仅在 macOS 上实测,其他系统如遇问题请检查文件路径和权限。
字体适用边界与许可提示
- 霞鹜文楷轻便版采用 SIL OFL 1.1 许可,再分发时须附带
OFL.txt,不得单独售卖字体文件。 - Lite 版本字库为常用字子集,若图表涉及生僻字或繁体扩展区,请核对字形覆盖或选用完整版。
- 本文演示字体取自作者仓库
fonts/TTF/LXGWWenKaiLite-Regular.ttf,Version 1.530;其他渠道获取的同名字体版本可能不同,建议以文件内嵌版本号为准。
配套字体资料
我整理的霞鹜文楷轻便版字体资料也提供夸克网盘分享,方便需要集中保存字体文件的读者:
打开配套字体资料(夸克网盘)
分享目录当前为 1 个 ZIP,约 48.3 MiB。打开后可查看文件清单,保存或下载可能需要登录夸克,请以网盘实际提示为准。压缩包内的字体版本以实际文件为准;上文 Version 1.530 的运行示例使用作者仓库中的 TTF。请同时保留并遵守字体的 OFL 许可文件,也可继续使用上文的作者仓库入口获取字体。
官方参考
- 霞鹜文楷轻便版作者项目
- 作者项目 OFL.txt
- Matplotlib 字体管理 API
本文由 AI 辅助起草,示例代码经实际运行并人工核对。