news 2026/5/23 17:38:31

Python Matplotlib 中直接加载本地字体文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python Matplotlib 中直接加载本地字体文件

Python Matplotlib 中直接加载本地字体文件

flyfish

python实现 绕过操作系统的字体库,直接读取本地字体文件,将其注册到 Matplotlib 的字体管理体系中

查找所有中文字体(含文件路径)

fc-list:lang=zh-f"%{file}\n"

这里以NotoSansCJK-Regular.ttc字体文件举例
NotoSansCJK-Regular.ttc介绍

  1. Noto:字体项目名称
    No Tofu(无豆腐块)早期不同语言在系统中无对应字体时,文字会显示为「□」(豆腐块 / Tofu),彻底解决「豆腐块」问题。

  2. Sans:字体风格(无衬线)
    Sans = Sans-serif(无衬线),是字体的外观风格:
    「衬线(Serif)」:字体笔画末端有装饰性小短线
    「无衬线(Sans)」:笔画末端无装饰
    Noto Sans 适合屏幕显示,Noto Serif(衬线版)适合印刷 / 文档。

  3. CJK:语言覆盖范围
    全称:Chinese + Japanese + Korean(中、日、韩)。
    中日韩三国文字共享大量汉字(形异 / 音异 / 义异),Noto 将这三种语言的字符整合到同一字体家族中,避免单独设计多套字体,同时保证字符风格统一。Noto CJK 还包含越南喃字等衍生字符,是覆盖最完整的 CJK 开源字体。

  4. ttc 格式文件是 TrueType Collection(TrueType 字体集合),是把多个 TTF 字体打包到一个文件里,比如 NotoSansCJK-Regular.ttc 包含了简 / 繁 / 日 / 韩等 CJK 字体变体

特征TTF(TrueType Font)TTC(TrueType Collection)
本质单个字体文件多个 TTF 字体的「打包集合文件」
文件内容仅包含一套字体(如简体中文)包含多套字体(如简/繁/日/韩 CJK 变体)
体积较小(单变体)较大(多变体打包)

一、复制 .ttc 字体文件到项目目录

执行以下命令,把系统中的NotoSansCJK-Regular.ttc复制到项目的fonts文件夹

# 1. 新建fonts文件夹(替换为你的项目路径,比如~/my_plot_project)mkdir-p ~/my_plot_project/fonts# 2. 复制.ttc文件到fonts目录cp/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc ~/my_plot_project/fonts/

二、Python 加载 .ttc 字体并绘制中文

.ttc是字体集合,加载时 Matplotlib 会自动识别其中的简体中文字体,代码和加载.ttf几乎一致:

importosimportmatplotlib.pyplotaspltfrommatplotlibimportfont_manager# --------------------------# 1. 配置.ttc字体文件路径(跨系统兼容)# --------------------------# 注意:文件名是NotoSansCJK-Regular.ttc(和你找到的一致)FONT_FILE="NotoSansCJK-Regular.ttc"font_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),# 当前脚本所在目录"fonts",FONT_FILE)# 验证文件是否存在(避免路径错误)ifnotos.path.exists(font_path):raiseFileNotFoundError(f"字体文件不存在:{font_path}\n请检查复制的路径是否正确")# --------------------------# 2. 注册.ttc字体并全局配置# --------------------------# 注册字体集合文件到Matplotlibfont_manager.fontManager.addfont(font_path)# 获取字体名称(Matplotlib会自动识别.ttc中的简体中文字体)font_name=font_manager.FontProperties(fname=font_path).get_name()print(font_name)# 中文显示核心配置(必加)plt.rcParams['font.family']=font_name# 全局默认用该中文字体plt.rcParams['axes.unicode_minus']=False# 解决负号显示方块问题# --------------------------# 3. 绘图验证中文显示# --------------------------fig,ax=plt.subplots(figsize=(8,5),dpi=100)# 绘制示例数据(含负号,测试兼容性)x=[1,2,3,4,5]y=[120,-50,200,80,-30]ax.plot(x,y,linewidth=2,color="#2E86AB",marker="o",label="简体中文标签")# 所有文本直接写中文,无需额外指定字体ax.set_title("标题:NotoSansCJK-Regular.ttc 测试",fontsize=16)ax.set_xlabel("横轴:月份(1-5月)",fontsize=12)ax.set_ylabel("纵轴:销售额(万元)",fontsize=12)ax.legend(loc="upper right")# 图例(中文)ax.text(3,150,"注释:负数值测试 -50.8",fontsize=10)# 含负号的中文# 调整布局,避免文字裁剪plt.tight_layout()# 保存图片(跨系统打开均能显示中文)plt.savefig("chinese_plot_ttc.png",dpi=100)plt.show()# 验证加载的字体名称(可选)print(f"成功加载的字体名称:{font_name}")# 输出示例:Noto Sans CJK SC(自动识别简体中文变体)

只需将fonts/NotoSansCJK-Regular.ttc和 Python 脚本一起打包,目录结构如下:

my_plot_project/ ├── plot_chinese.py # 绘图脚本 └── fonts/ └── NotoSansCJK-Regular.ttc # 复制的.ttc字体文件

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 14:24:15

【开题答辩全过程】以 基于Django框架的永安篮球俱乐部运动员损伤康复管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/5/23 9:26:29

Wan2.2-T2V-A14B在地震应急疏散演练视频中的路径规划能力

Wan2.2-T2V-A14B在地震应急疏散演练视频中的路径规划能力 你有没有想过,一场逼真的地震疏散演练,不需要拉警报、不用清空教学楼,甚至不用一个人到场——只需要一段文字描述,AI就能自动生成全程高清视频?🎬 …

作者头像 李华
网站建设 2026/5/13 4:06:26

IP 混叠

✅ IP 混叠的概念 IP aliasing 指的是在 同一个网络接口(网卡) 上配置多个 IP 地址。这些 IP 可以属于同一个子网,也可以属于不同子网。作用:一台设备可以同时参与多个网络,或者提供多个服务 IP。U-Boot 的网络栈非常简…

作者头像 李华
网站建设 2026/5/22 2:12:43

Wan2.2-T2V-A14B能否生成带有品牌LOGO的定制视频

Wan2.2-T2V-A14B能否生成带有品牌LOGO的定制视频 在数字营销的战场上,每一秒都价值千金。你有没有遇到过这样的场景:市场部急着要一条新品发布的宣传视频,设计师还在熬夜改第八版分镜,而发布会倒计时已经进入48小时?&a…

作者头像 李华
网站建设 2026/5/13 4:06:49

Wan2.2-T2V-A14B如何确保画面美学与艺术风格一致性?

Wan2.2-T2V-A14B如何确保画面美学与艺术风格一致性? 你有没有遇到过这样的情况:输入一段诗意的描述,比如“穿汉服的少女在落樱中起舞,光影柔和,色调统一为粉白与朱红”,结果生成的视频前两秒是水墨风&#…

作者头像 李华