Matplotlib中文乱码的根本原因是默认字体不支持中文且字体查找机制跳过系统中文字体,同时mathtext将减号映射为U+2212而中文字体通常不覆盖该码位。
-)显示为方块或空格,是因为 Matplotlib 将减号当作数学符号,启用 mathtext 渲染时默认使用 STIX 或 Computer Modern 字体——它们也不含中文,且对 ASCII 减号做了 Unicode 映射替换(变成 U+2212 MINUS SIGN),而中文字体通常不覆盖该码位。
matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf'),然后用 matplotlib.font_manager.FontProperties 加载plt.rcParams['font.sans-serif'] = ['SimHei', 'KaiTi', 'Microsoft YaHei', 'AR PL UKai CN']
plt.rcParams['axes.unicode_minus'] = False(否则负号仍变方块)import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
plt.plot([1, 2, 3], [-10, -5, 0])
plt.title('温度变化趋势')
plt.show()
matplotlibrc
永久生效的关键是改对文件——不是 Python site-packages 下的模板,而是用户级配置目录下的实际生效文件:
matplotlib.get_configdir() 查到路径(如 ~/.matplotlib 或 C:\Users\XXX\.matplotlib)matplotlibrc(无后缀),添加三行:font.sans-serif: Microsoft YaHei, SimHei, KaiTi, sans-serif axes.unicode_minus: False axes.titlesize: medium注意:
font.sans-serif 值列表里**不能有空格分隔的逗号以外的空白**(如 Microsoft YaHei , SimHei 会失败);顺序代表 fallback 优先级,建议把最稳定、系统必有的字体放前面。
Microsoft YaHei(微软雅黑)、SimHei(黑体),避免用 NSimSun(新宋体)——它不支持粗体变体,title 加粗会回退失败Heiti SC(黑体-简)、Hiragino Sans GB,但需确认是否在 findSystemFonts() 结果里出现(某些版本需手动安装)Noto Sans CJK SC 在 matplotlib 中注册名为 Noto Sans CJK JP 或 AR PL UMing CN,建议先运行 fc-list :lang=zh 查真实名称sans-serif,防止前面全失效时至少不报错matplotlib.rcParams 在模块导入时就已初始化完毕,运行时改 matplotlibrc 文件不会自动重载。
字体配置看着简单,但实际生效依赖字体文件存在、名称拼写精确、fallback 顺序合理、以及 mathtext 开关匹配——漏掉任意一环,中文或负号就可能突然“消失”。