matplotlib 如何让中文不乱码 + 负号正常显示(永久配置)
技术百科
舞夢輝影
发布时间:2026-01-24
浏览: 次 Matplotlib中文乱码的根本原因是默认字体不支持中文且字体查找机制跳过系统中文字体,同时mathtext将减号映射为U+2212而中文字体通常不覆盖该码位。
matplotlib 中文乱码的根本原因是什么
Matplotlib 默认字体不支持中文,且其字体查找机制会跳过系统中已安装的中文字体;同时,默认字体(如 DejaVu Sans)不包含中文字符映射,导致显示为方块。负号(-)显示为方块或空格,是因为 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()
永久配置:修改 matplotlib 配置文件 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 优先级,建议把最稳定、系统必有的字体放前面。
Windows / macOS / Linux 各平台字体名差异与避坑点
不同系统预装字体名不一致,硬写死一个名字容易失效:
- Windows 推荐用:
Microsoft YaHei(微软雅黑)、SimHei(黑体),避免用 NSimSun(新宋体)——它不支持粗体变体,title 加粗会回退失败
- macOS 可用:
Heiti SC(黑体-简)、Hiragino Sans GB,但需确认是否在 findSystemFonts() 结果里出现(某些版本需手动安装)
- Linux(如 Ubuntu)常见问题:系统自带的
Noto Sans CJK SC 在 matplotlib 中注册名为 Noto Sans CJK JP 或 AR PL UMing CN,建议先运行 fc-list :lang=zh 查真实名称
- 所有平台都建议加一个兜底项
sans-serif,防止前面全失效时至少不报错
改完配置后,**必须重启 Python 解释器或 Jupyter kernel**,因为 matplotlib.rcParams 在模块导入时就已初始化完毕,运行时改 matplotlibrc 文件不会自动重载。
字体配置看着简单,但实际生效依赖字体文件存在、名称拼写精确、fallback 顺序合理、以及 mathtext 开关匹配——漏掉任意一环,中文或负号就可能突然“消失”。
- 先查系统中可用的中文字体:
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()
永久配置:修改 matplotlib 配置文件 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 优先级,建议把最稳定、系统必有的字体放前面。
Windows / macOS / Linux 各平台字体名差异与避坑点
不同系统预装字体名不一致,硬写死一个名字容易失效:
- Windows 推荐用:
Microsoft YaHei(微软雅黑)、SimHei(黑体),避免用 NSimSun(新宋体)——它不支持粗体变体,title 加粗会回退失败
- macOS 可用:
Heiti SC(黑体-简)、Hiragino Sans GB,但需确认是否在 findSystemFonts() 结果里出现(某些版本需手动安装)
- Linux(如 Ubuntu)常见问题:系统自带的
Noto Sans CJK SC 在 matplotlib 中注册名为 Noto Sans CJK JP 或 AR PL UMing CN,建议先运行 fc-list :lang=zh 查真实名称
- 所有平台都建议加一个兜底项
sans-serif,防止前面全失效时至少不报错
改完配置后,**必须重启 Python 解释器或 Jupyter kernel**,因为 matplotlib.rcParams 在模块导入时就已初始化完毕,运行时改 matplotlibrc 文件不会自动重载。
字体配置看着简单,但实际生效依赖字体文件存在、名称拼写精确、fallback 顺序合理、以及 mathtext 开关匹配——漏掉任意一环,中文或负号就可能突然“消失”。
matplotlib.get_configdir() 查到路径(如 ~/.matplotlib 或 C:\Users\XXX\.matplotlib)matplotlibrc(无后缀),添加三行:- Windows 推荐用:
Microsoft YaHei(微软雅黑)、SimHei(黑体),避免用NSimSun(新宋体)——它不支持粗体变体,title加粗会回退失败 - macOS 可用:
Heiti SC(黑体-简)、Hiragino Sans GB,但需确认是否在findSystemFonts()结果里出现(某些版本需手动安装) - Linux(如 Ubuntu)常见问题:系统自带的
Noto Sans CJK SC在 matplotlib 中注册名为Noto Sans CJK JP或AR PL UMing CN,建议先运行fc-list :lang=zh查真实名称 - 所有平台都建议加一个兜底项
sans-serif,防止前面全失效时至少不报错
matplotlib.rcParams 在模块导入时就已初始化完毕,运行时改 matplotlibrc 文件不会自动重载。
字体配置看着简单,但实际生效依赖字体文件存在、名称拼写精确、fallback 顺序合理、以及 mathtext 开关匹配——漏掉任意一环,中文或负号就可能突然“消失”。
# ai
# 的是
# 是因为
# 看着
# python
# windows
# 跳过
# 微软
# mac
# 不支持
# 目录下
# win
# microsoft
# linux
# ubuntu
# macos
# 中文乱码
# ar
# 根本原因
# ASCII
# 这不是
# 不含
# matplotlib
# jupyter
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何处理“XML格式不正确”错误 常见XML we
- Win11怎么设置开机密码_Windows11账户
- Python对象比较排序规则_集合使用说明【指导】
- Python正则表达式实战_模式匹配说明【教程】
- Win10怎么关闭自动更新错误弹窗_Win10策略
- C++友元类使用场景_C++类间协作设计方式讲解
- Win11任务栏颜色怎么改_Win11自定义任务栏
- Python对象比较与排序_集合使用说明【指导】
- PowerShell怎么创建复杂的XML结构
- c# Task.ConfigureAwait(tr
- php中self::能调用子类重写的方法吗_静态绑
- 如何使用Golang recover捕获panic
- Win10如何优化内存使用_Win10内存优化技巧
- Win11怎么关闭OneDrive同步_Win11
- Python数据挖掘核心算法实践_聚类分类与特征工
- MAC怎么使用表情符号面板_MAC Emoji快捷
- Windows10如何更改盘符名称_Win10重命
- Win11怎么设置ip地址_Windows 11手
- 如何在 Go 中高效缓存与分发网络视频流
- 如何使用Golang log记录不同级别日志_Go
- 如何使用Golang捕获并记录协程panic_保证
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- 如何使用Golang捕获测试日志_Golang t
- 如何在 Go 中判断变量是否为函数类型
- Python网络异常模拟_测试说明【指导】
- ACF 教程:如何正确更新嵌套在多层 Group
- Win11应用商店下载慢怎么办 Win11更改DN
- c++中如何使用auto关键字_c++11类型推导
- 如何使用Golang sync.Map实现并发安全
- Avalonia如何实现跨窗口通信 Avaloni
- Win10怎样设置多显示器_Win10多显示器扩展
- Linux怎么禁止Root用户远程登录_Linux
- 如何在 Go 中正确初始化结构体中的 map 字段
- Windows执行文件被SmartScreen拦截
- Win11怎么设置右键刷新选项_Windows11
- Windows10怎么用“讲述人”读屏辅助 Win
- php485在macos下怎么配置_php485
- Win11怎么设置虚拟内存_Windows 11优
- php串口通信波特率怎么选_根据硬件手册设置正确波
- Dapper的Execute方法的返回值是什么意思
- Win11如何连接Xbox手柄 Win11蓝牙连接
- Win11怎么设置任务栏对齐方式_Windows1
- Win11怎么关闭自动维护 Win11禁用系统自动
- 如何在 Python 测试中动态配置 @backo
- c++怎么调用nana库开发GUI_c++ 现代风
- Win11怎样安装剪映专业版_Win11安装剪映教
- Win10电脑怎么设置IP地址_Windows10
- 网站内页做seo排名怎么做?
- Win11如何设置电源计划_Win11电源计划优化
- Python与GPU加速技术_CUDA与Numba


QQ客服