Python Matplotlib Chinese Font

Polar Sponsor
爱发电 赞助
.NET 9.0

使用 font_manager.addfont() 添加中文字体文件,设置 rcParams['font.family'],并禁用 unicode_minus,使 matplotlib 显示中文。

python-matplotlib-chinese-font

功能概述

python-matplotlib-chinese-font是一项面向实际任务的技能,主要用于Python matplotlib 中文字体配置解决方案;📌 问题描述;

核心要点

  • matplotlib 默认不支持中文,中文会显示为方块/方框;
  • 控制台警告:;
  • 根本原因 :matplotlib 的默认字体不包含中文字符;

使用与执行

🎯 使用场景;当以下情况时使用此 Skill :;✅ matplotlib 绑图中中文显示为方框/乱码;✅ 需要配置中文字体。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。

结果检查与注意事项

实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。

python-matplotlib-chinese-font

Python matplotlib 中文字体配置解决方案

📌 问题描述

matplotlib 默认不支持中文,中文会显示为方块/方框

控制台警告:

UserWarning: Glyph XXXXX missing from current font

根本原因:matplotlib 的默认字体不包含中文字符。

🎯 使用场景

当以下情况时使用此 Skill:

  1. ✅ matplotlib 绑图中中文显示为方框/乱码
  2. ✅ 需要配置中文字体
  3. ✅ 负号显示为方框
  4. ✅ 图例、标题、坐标轴标签中文显示异常
  5. ✅ 跨平台字体兼容问题
  6. ✅ 字体路径配置问题
  7. ✅ 字体缓存问题

🚀 快速开始

第 0 步:下载字体文件

# 创建字体目录
mkdir -p fonts

# 下载 BabelStoneHan 字体(约 50MB)
curl -L -o fonts/BabelStoneHan.ttf "https://www.babelstone.co.uk/Fonts/Download/BabelStoneHan.ttf"

# 或者使用 wget
wget -O fonts/BabelStoneHan.ttf "https://www.babelstone.co.uk/Fonts/Download/BabelStoneHan.ttf"

其他字体选择(小于 10MB):

  • WenQuanYi Micro Hei (文泉驿微米黑) - 约 4MB
  • SimHei (黑体) - 系统自带
  • Microsoft YaHei (微软雅黑) - Windows 系统自带

方法 1:复制模板(推荐)

# 复制配置模板到你的项目
cp ~/.openclaw/skills/python-matplotlib-chinese-font/templates/setup_font.py ./

方法 2:直接使用字体文件

import os
import matplotlib.pyplot as plt
from matplotlib import font_manager as fm

# 字体文件路径(请修改为你的实际路径)
font_file = './fonts/BabelStoneHan.ttf'

# 关键:显式添加字体
fm.fontManager.addfont(font_file)

# 创建 FontProperties
font_prop = fm.FontProperties(fname=font_file)

# 设置全局字体
plt.rcParams['font.family'] = font_prop.get_name()
plt.rcParams['axes.unicode_minus'] = False

# 使用
fig, ax = plt.subplots()
ax.set_title('中文标题', fontproperties=font_prop)
ax.set_xlabel('横轴', fontproperties=font_prop)
ax.legend(['图例'], prop=font_prop)

📋 完整配置代码(3 步)

第 1 步:下载并准备字体文件

# 创建字体目录
mkdir -p fonts

# 下载 BabelStoneHan 字体
curl -L -o fonts/BabelStoneHan.ttf "https://www.babelstone.co.uk/Fonts/Download/BabelStoneHan.ttf"

项目结构:

your_project/
├── fonts/
│   └── BabelStoneHan.ttf  ← 中文字体文件(需自行下载)
├── scripts/
│   └── your_script.py
└── ...

字体推荐:

  • BabelStoneHan.ttf(开源,支持中文)← 需自行下载,约 50MB
  • SimHei.ttf(黑体)- 系统自带
  • Microsoft YaHei.ttf(微软雅黑)- Windows 系统自带
  • WenQuanYi Micro Hei(文泉驿微米黑)- 约 4MB

第 2 步:配置字体

import os
import matplotlib.pyplot as plt
from matplotlib import font_manager as fm

# 字体文件相对于脚本的路径
_FONT_FILE_RELATIVE = os.path.join('..', '..', 'fonts', 'BabelStoneHan.ttf')

def _get_font_path():
    """获取字体文件的绝对路径"""
    script_dir = os.path.dirname(os.path.abspath(__file__))
    font_file = os.path.join(script_dir, _FONT_FILE_RELATIVE)
    return os.path.normpath(font_file)

def setup_chinese_font():
    """配置中文字体(兼容所有 matplotlib 版本)"""
    font_file = _get_font_path()
    
    if os.path.exists(font_file):
        # 创建 FontProperties
        font_prop = fm.FontProperties(fname=font_file)
        font_name = font_prop.get_name()
        
        # 注册字体(兼容新旧版本 matplotlib)
        try:
            # 方法1:matplotlib 3.2+ 使用 addfont
            if hasattr(fm.fontManager, 'addfont'):
                fm.fontManager.addfont(font_file)
            else:
                # 方法2:旧版本 matplotlib,手动添加到字体列表
                try:
                    fm.fontManager.ttflist.append(fm.FontEntry(
                        fname=font_file,
                        name=font_name,
                        style=font_prop.get_style(),
                        variant=font_prop.get_variant(),
                        weight=font_prop.get_weight(),
                        stretch=font_prop.get_stretch(),
                        size=font_prop.get_size()
                    ))
                except Exception:
                    pass
        except Exception:
            pass
        
        # 设置全局字体
        plt.rcParams['font.family'] = font_name
        plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
        
        return font_prop
    
    return fm.FontProperties()

⚠️ 版本兼容性说明:

matplotlib 版本 方法 说明
≥ 3.2 fontManager.addfont() 推荐方法
< 3.2 fontManager.ttflist.append() 兼容方法
    # 创建 FontProperties
    font_prop = fm.FontProperties(fname=font_file)
    
    # 设置全局字体
    plt.rcParams['font.family'] = font_prop.get_name()
    plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
    
    print(f"✅ 已加载中文字体: {font_file}")
    return font_prop
else:
    print(f"⚠️ 未找到字体文件: {font_file}")
    return fm.FontProperties()

使用

chinese_font = setup_chinese_font()

---

### **第 3 步:在绑图时使用字体**

#### **方法 A:全局设置(推荐)**

```python
# 配置字体
chinese_font = setup_chinese_font()

# 绑图时自动使用全局字体
fig, ax = plt.subplots()
ax.set_title('中文标题')  # 自动使用全局字体
ax.set_xlabel('横轴标签')
ax.legend(['图例1', '图例2'])

方法 B:局部指定(精确控制)

# 配置字体
chinese_font = setup_chinese_font()

# 绑图时显式指定 fontproperties
fig, ax = plt.subplots()
ax.set_title('中文标题', fontproperties=chinese_font)
ax.set_xlabel('横轴标签', fontproperties=chinese_font)
ax.legend(['图例1', '图例2'], prop=chinese_font)

🎯 核心要点(5 个关键点)

1. 字体文件路径

# ❌ 错误:使用运行目录
font_file = os.path.join(os.getcwd(), 'fonts', 'BabelStoneHan.ttf')

# ✅ 正确:使用脚本所在目录
script_dir = os.path.dirname(os.path.abspath(__file__))
font_file = os.path.join(script_dir, '..', '..', 'fonts', 'BabelStoneHan.ttf')
font_file = os.path.normpath(font_file)  # 规范化路径

2. 显式添加字体(最关键!)

# ❌ 错误:直接创建 FontProperties
font_prop = fm.FontProperties(fname=font_file)

# ✅ 正确:先 addfont,再创建 FontProperties
fm.fontManager.addfont(font_file)  # 关键!
font_prop = fm.FontProperties(fname=font_file)

3. 设置全局字体

# 设置全局字体
plt.rcParams['font.family'] = font_prop.get_name()
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

4. 使用绝对路径

# ✅ 使用 os.path.normpath() 规范化路径
font_file = os.path.normpath(font_file)

# ✅ 检查文件是否存在
if os.path.exists(font_file):
    fm.fontManager.addfont(font_file)

5. 字体文件在项目内

✅ 优点:
- 不依赖系统字体
- 可移植性好
- 跨平台兼容

❌ 避免:
- 使用系统字体路径(/usr/share/fonts/...)
- 假设字体已安装

🚨 常见问题

问题 1:中文显示为方框

原因:没有调用 addfont() 显式添加字体

解决:

# ✅ 必须先调用 addfont
fm.fontManager.addfont(font_file)
font_prop = fm.FontProperties(fname=font_file)

问题 2:负号显示为方框

原因:字体不支持负号

解决:

plt.rcParams['axes.unicode_minus'] = False

问题 3:字体路径错误

原因:使用 os.getcwd() 而不是脚本所在目录

解决:

# ✅ 使用脚本所在目录
script_dir = os.path.dirname(os.path.abspath(__file__))

问题 4:图片已生成但中文仍是方框

原因:代码修改有误或发送了旧图片

解决:

  1. 删除旧图片:rm -f output.png
  2. 重新运行脚本
  3. 检查图片修改时间:stat output.png | grep Modify

问题 6:'FontManager' object has no attribute 'addfont'

原因:fontManager.addfont() 是 matplotlib 3.2+ 才有的方法

解决:使用版本兼容性检查

# 兼容所有 matplotlib 版本
if hasattr(fm.fontManager, 'addfont'):
    # matplotlib 3.2+
    fm.fontManager.addfont(font_file)
else:
    # matplotlib < 3.2
    try:
        fm.fontManager.ttflist.append(fm.FontEntry(...))
    except Exception:
        pass

检查 matplotlib 版本:

import matplotlib
print(matplotlib.__version__)

问题 7:字体缓存问题

原因:matplotlib 缓存了旧字体配置

解决:

# 清除字体缓存
try:
    fm._load_fontmanager(try_read_cache=False)
except:
    pass

📊 对比总结

方案 优点 缺点 推荐度
字体文件在项目内 可移植、跨平台 需要管理字体文件 ⭐⭐⭐⭐⭐
使用系统字体 无需管理文件 依赖系统、不可移植 ⭐⭐
临时下载字体 自动化 网络依赖、速度慢 ⭐⭐⭐

📁 Skill 包含内容

python-matplotlib-chinese-font/
├── SKILL.md                    # Skill 说明文档(本文件)
├── references/
│   ├── plot_utils.py          # 完整工具模块
│   └── test_chinese_font.py   # 测试代码
└── templates/
    └── setup_font.py          # 配置模板(可直接复制)

⚠️ 字体文件需自行下载,详见"第 0 步:下载字体文件"

📚 参考代码

完整工具模块:references/plot_utils.py

  • ✅ 完整的字体配置函数
  • ✅ 可直接导入使用
  • ✅ 包含常用绘图参数

测试代码:references/test_chinese_font.py

  • ✅ 4 种测试场景
  • ✅ 验证中文显示是否正常
  • ✅ 包含负数测试

配置模板:templates/setup_font.py

  • ✅ 可直接复制到项目
  • ✅ 只需修改字体路径

💡 最佳实践

# ✅ 推荐配置
import os
import matplotlib.pyplot as plt
from matplotlib import font_manager as fm

# 1. 字体路径(相对于脚本)
_FONT_FILE_RELATIVE = os.path.join('..', '..', 'fonts', 'BabelStoneHan.ttf')

# 2. 获取绝对路径
def _get_font_path():
    script_dir = os.path.dirname(os.path.abspath(__file__))
    font_file = os.path.join(script_dir, _FONT_FILE_RELATIVE)
    return os.path.normpath(font_file)

# 3. 配置字体
def setup_chinese_font():
    font_file = _get_font_path()
    
    if os.path.exists(font_file):
        fm.fontManager.addfont(font_file)  # 关键!
        font_prop = fm.FontProperties(fname=font_file)
        plt.rcParams['font.family'] = font_prop.get_name()
        plt.rcParams['axes.unicode_minus'] = False
        return font_prop
    
    return fm.FontProperties()

# 4. 使用
chinese_font = setup_chinese_font()

🔗 相关链接

  • BabelStone Fonts: https://www.babelstone.co.uk/Fonts/Han.html
  • Matplotlib Font Management: https://matplotlib.org/stable/api/font_manager_api.html
  • Matplotlib Chinese Font Guide: https://matplotlib.org/stable/tutorials/text/text_intro.html

📝 版本历史

版本 日期 说明
v1.0.0 2026-03-21 初始版本 - BabelStoneHan 字体配置方案
v1.1.0 2026-03-21 添加 matplotlib 版本兼容性支持
v1.2.0 2026-04-02 字体文件改为用户自行下载(满足 clawhub 文件大小限制)

Skill 创建时间:2026-03-21
维护者:太子
当前版本:v1.2.0

相关专题

更多
Python Django REST Framework接口安全与认证体系实践
Python Django REST Framework接口安全与认证体系实践

本专题围绕 Django REST Framework 展开,深入讲解 API 认证、JWT 鉴权、权限控制、接口安全防护以及防攻击策略设计。通过完整后端案例,帮助开发者构建安全可靠的 Web API 服务体系。

2026.06.29

140

15

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

2026.06.16

219

12

Python数据分析实战指南
Python数据分析实战指南

聚焦Python在数据分析领域的核心应用,涵盖Pandas、NumPy、Matplotlib等库的使用技巧、真实业务场景案例及性能优化方法。

2026.06.04

146

48

Python入门零基础通关合集
Python入门零基础通关合集

从安装环境、变量循环到函数与类,专为小白设计的手把手Python教程,配套100道实战练习题,快速掌握自动化与数据分析基础。

2026.06.03

334

26

Python 设计模式与代码架构教程合集
Python 设计模式与代码架构教程合集

以 Python 语言特性为基础,讲解经典设计模式的 Pythonic 实现方式,涵盖单例模式(模块级/元类/new)、工厂模式与注册表模式、策略模式(函数作为一等公民替代类继承)、观察者模式(信号与事件系统)、装饰器模式(语言原生支持)、代理模式(getattr 动态代理)、依赖注入(dependency-injector 库)、仓储模式(Repository Pattern)在数据层的应用,同时讲解 Python 项目的分层架构(领

2026.05.15

424

19

Python日志系统与监控告警教程大全
Python日志系统与监控告警教程大全

全面讲解 Python 应用的日志管理与监控方案,涵盖 logging 标准库的 Logger/Handler/Formatter/Filter 体系、日志级别规范与分模块配置、dictConfig / fileConfig 声明式配置、loguru 第三方库的简洁用法与结构化输出、日志轮转(RotatingFileHandler/TimedRotatingFileHandler)策略、JSON 格式结构化日志输出、ELK / Loki

2026.05.15

186

27

Python数据库与ORM实践
Python数据库与ORM实践

全面讲解 Python 中数据库操作的技术方案,涵盖 sqlite3 标准库的轻量数据库操作、PyMySQL / psycopg2 连接 MySQL / PostgreSQL、DB-API 2.0 规范与游标操作、SQL 注入防范与参数化查询、SQLAlchemy Core 表达式语言与 ORM 模型定义/查询/关联关系映射、Alembic 数据库迁移管理、连接池(SQLAlchemy Pool / DBUtils)配置与调优、异步数据

2026.05.11

171

19

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

2026.05.09

316

23

Python多线程、多进程与并发编程教程大全
Python多线程、多进程与并发编程教程大全

系统讲解 Python 的并发与并行编程体系,涵盖 GIL 全局解释器锁的原理与影响分析、threading 模块的线程创建/锁/事件/信号量、multiprocessing 模块的进程创建/进程间通信(Queue/Pipe/共享内存)、concurrent.futures 线程池与进程池的统一接口、I/O 密集型与 CPU 密集型任务的方案选择、多线程竞态条件排查与线程安全数据结构、subprocess 子进程管理,帮助开发者根据任务

2026.05.08

114

32

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程