☰
Matplotlib中文乱码:用项目内字体文件生成中文图表
2026/10/18 13:45:21 网站建设 项目流程

问题背景

Matplotlib 默认字体不包含中文字形,在图表标题、坐标轴标签中使用中文时会出现方块或警告。常见做法是修改全局rcParams,但这依赖系统已安装对应字体,换台机器就可能失效。本文介绍一种更可控的方式:将字体文件放在项目目录内,通过font_manager.fontManager.addfont在当前进程中注册,无需修改系统字体。

环境与前置条件

项目版本/说明
Python3.10.13
Matplotlib3.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 辅助起草,示例代码经实际运行并人工核对。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询