matplotlib 中文显示需手动配置字体而非依赖系统路径,先检查可用中文字体名,再通过 plt.rcparams 设置 font.sans-serif 和 axes.unicode_minus,或用 fontproperties 临时指定;常见有效字体包括 simhei、noto sans cjk sc 等,配置须在绘图前执行且避免被样式表覆盖。

直接换字体配置,别依赖系统自带的中文字体路径。 Matplotlib 默认不加载中文支持,硬塞中文字符串只会渲染成方框——这不是编码问题,是字体缺失或未声明的问题。
检查当前可用字体列表
先确认 Matplotlib 能识别哪些中文字体,避免盲目指定一个根本不存在的字体名:
import matplotlib.font_manager as fm fonts = [f.name for f in fm.fontManager.ttflist] print([f for f in fonts if 'Sim' in f or 'Noto' in f or 'Microsoft' in f or 'Kai' in f or 'Fang' in f])
常见有效字体名包括 SimHei(Windows)、Noto Sans CJK SC(macOS/Linux)、AR PL UKai CN(Linux)。注意:返回的是字体 显示名,不是文件名,别去查 .ttf 路径。
全局设置中文字体(推荐方式)
在绘图前执行一次即可,后续所有图表自动生效。关键点是同时设置 font.sans-serif 和关闭 axes.unicode_minus(否则负号会变方框):
- 用
plt.rcParams设置,比每次调plt.xlabel(fontproperties=...)更省事 - 把中文字体名放在列表最前面,Matplotlib 会按顺序 fallback
- 务必加
'sans-serif'类型,否则font.sans-serif不生效
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei', 'Noto Sans CJK SC', 'KaiTi', 'DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False
临时覆盖单个文本元素的字体
如果只改某处标题或坐标轴标签,且不想影响全局,用 fontproperties 参数更安全:
- 必须传入
FontProperties实例,不能直接传字符串 - 指定
fname时,路径要绝对、可读,且字体文件确实含中文字符集 - Windows 下常用
C:/Windows/Fonts/simhei.ttf,但跨平台项目慎用硬编码路径
from matplotlib.font_manager import FontProperties
font = FontProperties(fname='simhei.ttf') # 或用上面查到的字体名
plt.title('中文标题', fontproperties=font)
为什么改了还不显示?几个高频坑
方框没消失,大概率掉进以下某个坑里:
-
plt.rcParams写在plt.show()之后 —— 配置必须在绘图调用前生效 - 用了
plt.style.use('seaborn')等样式表,它会重置rcParams,需在style.use后再设字体 - Jupyter 中重启内核后没重跑字体配置代码 —— 每次新会话都要执行一遍
- 字体名拼错,比如写成
'SimHei'却系统里只有'Microsoft YaHei',建议先用第一步查出的准确名字
字体配置不是“设一次永久有效”的功能,尤其在交互式环境里,容易被样式、内核状态、导入顺序悄悄覆盖。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











