Matplotlib默认不显示中文是因为其内置字体DejaVu Sans不含中文字符集,且不自动fallback至系统中文字体,必须显式配置中文字体路径或修改matplotlibrc文件,并设置axes.unicode_minus=False以解决负号显示问题。

为什么Matplotlib默认不显示中文
Matplotlib 默认使用的字体是 DejaVu Sans,它不包含中文字符集,遇到中文字符串时就用方框(□)占位。这不是编码错误,也不是数据问题,而是字体缺失导致的渲染失败。
关键点在于:Matplotlib 不会自动 fallback 到系统中已安装的中文字体,必须显式指定或配置。
快速修复:临时设置字体路径
适用于单次绘图、脚本调试或 Jupyter Notebook 快速验证。直接用 plt.rcParams 指定一个可用的中文字体文件路径:
- 先确认系统中存在支持中文的字体,常见路径有:
/System/Library/Fonts/PingFang.ttc(macOS)、C:\Windows\Fonts\simhei.ttf(Windows 仿宋)、/usr/share/fonts/truetype/wqy/wqy-microhei.ttc(Ubuntu 文泉驿) - 用
matplotlib.font_manager.findfont验证路径是否有效,例如:findfont('SimHei')返回空字符串说明未找到 - 设置后必须重置
matplotlib.font_manager._rebuild(),否则新字体不生效
示例代码:
立即学习“Python免费学习笔记(深入)”;
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans'] # 优先用 SimHei,找不到再 fallback plt.rcParams['axes.unicode_minus'] = False # 解决负号显示为方块的问题
一劳永逸:修改 Matplotlib 配置文件
适合长期项目或团队统一环境。修改的是 Matplotlib 的 matplotlibrc 文件,不是 Python 脚本。
- 运行
matplotlib.matplotlib_fname()查看当前生效的配置文件路径 - 编辑该文件,取消注释并修改:
font.sans-serif: SimHei, Bitstream Vera Sans, DejaVu Sans, sans-serif - 务必同时设置:
axes.unicode_minus: False,否则负号(如 -5)仍显示为方框 - 改完保存后,重启 Python 进程(Jupyter 需 kernel restart),配置才生效
注意字体名称和实际文件名的区别
很多人卡在「明明指定了 simhei.ttf,却还是方框」——因为 font.sans-serif 里填的是字体的 显示名称(family name),不是文件名。
例如:simhei.ttf 的真实 family name 可能是 SimHei 或 Microsoft YaHei,取决于字体元数据。错误写成 'simhei' 或 'simhei.ttf' 都无效。
- 用命令行检查:macOS 上执行
fc-list :lang=zh,Linux 执行fc-list | grep -i sim,Windows 可用 PowerShell:[System.Drawing.Text.InstalledFontCollection]::new().Families - Python 中验证:运行
from matplotlib.font_manager import fontManager; [f.name for f in fontManager.ttflist if 'sim' in f.name.lower()]
最稳妥的方式是用 findfont 测试具体 family name 是否被识别,而不是凭文件名猜测。


















