Matplotlib 默认不显示中文字体是因为其默认字体 DejaVu Sans 不包含中文字符集,需通过 plt.rcParams['font.sans-serif'] 设置中文字体并关闭 axes.unicode_minus。

为什么 matplotlib 默认不显示中文字体?
因为 matplotlib 默认字体是 DejaVu Sans,它不包含中文字符集。Pandas 的 .plot() 底层调用的就是 matplotlib,所以只要改掉 matplotlib 的字体配置,Pandas 绘图自然就支持中文了。
常见错误现象:plt.show() 出来的图里标题、坐标轴标签全是方框(),但英文和数字正常。
- 不是 Pandas 本身的问题,不用改
pandas.plot()参数 - 不是系统没装中文字体,而是
matplotlib没告诉自己“该用哪个字体” - 临时设置比修改配置文件更可控,尤其在 Jupyter 或多环境部署时
用 plt.rcParams 临时指定中文字体
这是最常用、最稳妥的实操方式,适合脚本或 notebook 开头一次性设置:
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False # 解决负号'−'显示为方块的问题
SimHei 是 Windows 自带的黑体,Arial Unicode MS 在 macOS/Windows 都较常见,DejaVu Sans 作为兜底。顺序很重要:靠前的字体优先尝试,找不到字符就 fallback 到下一个。
立即学习“Python免费学习笔记(深入)”;
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 必须在
import pandas as pd和绘图调用之前设置,否则无效 -
axes.unicode_minus=False很关键,否则负数坐标轴会显示异常 - 如果用的是 Linux 服务器,可换成
'WenQuanYi Zen Hei'或'Noto Sans CJK SC'
检查并确认当前可用中文字体路径
有时候写了字体名却还是方框,大概率是名字写错了,或者系统真没这个字体。用下面代码查真实可用列表:
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.lower() or 'hei' in f.lower() or 'song' in f.lower()])
输出类似 ['SimHei', 'KaiTi', 'Noto Sans CJK JP'] —— 这才是你能在 font.sans-serif 里放心写的名称。
- 不要凭感觉写“微软雅黑”,实际注册名可能是
Microsoft YaHei或MS Gothic - Jupyter 中运行后若返回空列表,说明
matplotlib没扫描到中文字体,需手动添加(见下条) - Mac 用户注意:
STHeiti已被弃用,推荐用PingFang SC或Noto Sans CJK SC
手动添加字体文件(当系统无合适字体时)
比如在 Docker 容器、CI 环境或精简版 Linux 上,可能连基础中文字体都没有。这时可以下载一个 TTF 文件(如 NotoSansCJKsc-Regular.otf),然后注入 matplotlib:
import matplotlib.font_manager as fm
fm.fontManager.addfont('/path/to/NotoSansCJKsc-Regular.otf')
plt.rcParams['font.sans-serif'] = ['Noto Sans CJK SC'] # 注意名称要和 fontManager 扫描到的一致字体文件名和注册名不一定相同,务必用上一节的 fm.fontManager.ttflist 确认注册名。
- 添加后需重启 Python 内核(Jupyter)或重建进程(脚本),缓存不会自动刷新
-
addfont()只影响当前会话,不修改全局配置 - 避免使用绝对路径硬编码,可用
Path(__file__).parent / "fonts/NotoSansCJKsc-Regular.otf"
真正卡住人的往往不是“怎么设”,而是设完没生效——多数时候是因为设置时机太晚、字体名拼错、或负号配置漏掉。把这三处对齐,95% 的方框问题就解决了。

















