Matplotlib中文显示乱码解决方法
学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《Matplotlib显示中文乱码解决方法》,以下内容主要包含等知识点,如果你正在学习或准备学习文章,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!
答案是配置Matplotlib使用支持中文的字体并清除缓存。文章指出Matplotlib默认字体不支持中文导致乱码,解决方法包括:设置rcParams['font.sans-serif']为系统中文字体如'SimHei'、'Microsoft YaHei'或'PingFang SC';通过fm._rebuild()清除字体缓存;设置rcParams['axes.unicode_minus']=False修复负号显示异常;并在不同操作系统下查找和配置对应中文字体;此外可使用FontProperties局部指定文本字体;若仍乱码需排查字体名称、路径、缓存、环境及权限等问题。

在Matplotlib里绘制图表时遇到中文乱码,这其实是个老生常谈的问题了,核心原因往往在于Matplotlib默认使用的字体库里没有包含中文字符集。它通常会选择一些英文字体,比如DejaVu Sans,这些字体自然无法正确渲染中文,所以你看到的就是方块或者一堆乱码。解决这个问题,关键就是告诉Matplotlib去用一个支持中文的字体。
解决方案
要彻底解决Matplotlib中文乱码问题,最直接有效的方法就是配置Matplotlib使用一个支持中文的字体。这通常涉及到修改全局配置参数,并可能需要清除字体缓存。
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import numpy as np
# 查找系统中的中文字体
# 这一步是关键,你需要找到一个你系统上确实存在的中文字体
# 例如:'SimHei' (Windows), 'Microsoft YaHei' (Windows), 'PingFang SC' (macOS), 'WenQuanYi Micro Hei' (Linux)
# 如果不确定,可以尝试打印所有可用字体:
# font_list = fm.findSystemFonts(fontpaths=None, fontext='ttf')
# for font_path in font_list:
# try:
# prop = fm.FontProperties(fname=font_path)
# if 'SimHei' in prop.get_name() or 'Microsoft YaHei' in prop.get_name() or 'PingFang SC' in prop.get_name() or 'WenQuanYi Micro Hei' in prop.get_name():
# print(f"Found Chinese font: {prop.get_name()} at {font_path}")
# except Exception:
# pass
# 假设我们找到了一个合适的字体,这里以'SimHei'为例
# 如果你的系统没有SimHei,请替换成你系统上实际存在的中文宋体或黑体
# 我个人在Windows上常用'Microsoft YaHei',macOS上用'PingFang SC',Linux上用'WenQuanYi Micro Hei'
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号'-'显示为方块的问题
# 接下来,清除Matplotlib的字体缓存
# 这一步非常重要,尤其是在你第一次设置字体或者更改字体之后
# 因为Matplotlib会缓存字体信息,不清除缓存可能导致配置不生效
fm._rebuild()
# 示例绘图
plt.figure(figsize=(8, 6))
plt.plot(np.random.rand(10), label='随机数据')
plt.title('这是一个中文标题')
plt.xlabel('X轴标签')
plt.ylabel('Y轴标签')
plt.legend(title='图例')
plt.grid(True)
plt.show()
为什么我的Matplotlib会显示中文乱码?
我发现很多初学者遇到这个问题时都会有点困惑,明明Python代码没有报错,怎么输出的图表里中文就成了方块呢?其实这背后的逻辑并不复杂。Matplotlib在绘制文本时,会去查找系统上安装的字体来渲染字符。它有一个默认的字体优先级列表,通常会优先选择一些通用的英文字体,比如DejaVu Sans、Bitstream Vera Sans或者Latin Modern Sans等。这些字体对英文字符支持得很好,但它们压根就没包含中文字符的字形(glyph)。
当Matplotlib尝试用一个不包含中文字符的字体去渲染中文时,它就不知道该怎么画这些字符了,所以最常见的表现就是显示成一个空白方块,或者一个问号,甚至是某种编码错误导致的乱码。这和我们平时在Word文档里,如果选择了一个英文字体去打中文,也会出现类似情况是一个道理。所以,问题的根源在于“字体缺失”而非“编码错误”。虽然有时候看起来像编码问题,但通常调整字体就能解决大部分情况。
如何在不同操作系统(Windows, macOS, Linux)上找到并配置中文字体?
找到一个合适的、支持中文的字体,是解决乱码问题的关键第一步。不同操作系统有它们各自常用的中文字体,以及查找字体的方式。我来给你梳理一下:
Windows 系统: Windows系统自带的中文字体非常丰富,比如“宋体”、“黑体”、“微软雅黑”(Microsoft YaHei)、“楷体”等。我个人最常用的是“微软雅黑”和“黑体”(SimHei),因为它们显示效果比较现代和清晰。
查找字体: 你可以在
C:\Windows\Fonts目录下找到所有已安装的字体文件。记住它们的英文名称,比如“黑体”对应的就是SimHei。配置方式:
import matplotlib.pyplot as plt import matplotlib.font_manager as fm # 设置字体为微软雅黑 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 或者设置为黑体 # plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False fm._rebuild() # 清除缓存
macOS 系统: macOS系统对中文的支持一直都很好,自带的字体也都很漂亮,比如“苹方”(PingFang SC)、“黑体-简”(Heiti SC)。
查找字体: 字体文件通常在
/System/Library/Fonts或/Library/Fonts目录下。你可以通过“字体册”应用来查看和管理字体,并找到它们的英文名称。我发现“苹方”系列字体显示效果很棒。配置方式:
import matplotlib.pyplot as plt import matplotlib.font_manager as fm # 设置字体为苹方-简 plt.rcParams['font.sans-serif'] = ['PingFang SC'] # 或者设置为黑体-简 # plt.rcParams['font.sans-serif'] = ['Heiti SC'] plt.rcParams['axes.unicode_minus'] = False fm._rebuild() # 清除缓存
Linux 系统: Linux系统由于其开源特性,字体管理相对更灵活但也可能更复杂一些。常见的支持中文的字体有“文泉驿微米黑”(WenQuanYi Micro Hei)、“思源黑体”(Noto Sans CJK)。你可能需要手动安装这些字体包。
查找字体:
- 你可以使用
fc-list :lang=zh命令在终端中列出所有支持中文的字体。 - 字体文件通常在
/usr/share/fonts或~/.local/share/fonts目录下。
- 你可以使用
安装字体(如果缺失):
- 对于Debian/Ubuntu系:
sudo apt-get install fonts-wqy-microhei - 对于CentOS/RHEL系:
sudo yum install wqy-microhei-fonts
- 对于Debian/Ubuntu系:
配置方式:
import matplotlib.pyplot as plt import matplotlib.font_manager as fm # 设置字体为文泉驿微米黑 plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei'] # 或者设置为思源黑体 # plt.rcParams['font.sans-serif'] = ['Noto Sans CJK SC'] plt.rcParams['axes.unicode_minus'] = False fm._rebuild() # 清除缓存
无论在哪种系统上,如果上述常用字体名称不生效,一个稳妥的方法是使用matplotlib.font_manager.FontProperties(fname='/path/to/your/font.ttf')直接指定字体文件的路径。但一般来说,系统自带的字体名称就够用了。
除了全局配置,还有哪些局部方法可以解决中文乱码问题?
虽然全局配置rcParams是最省心的方法,让整个图表的所有文本都使用指定字体,但有时候我们可能只希望图表中的某一部分文本(比如标题、某个标签)显示中文,而其他部分保持默认或使用其他字体。这时,局部配置就显得很有用了。我个人在做一些混合语言图表时,会倾向于这种方式。
Matplotlib的许多文本相关函数都提供了fontproperties参数,允许你为该特定文本元素指定字体。这比修改全局配置更灵活。
这里主要用到matplotlib.font_manager.FontProperties这个类。
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import numpy as np
# 首先,找到一个系统上的中文字体文件路径
# 这里我用一个通用路径作为示例,你需要替换成你系统上实际存在的字体文件路径
# 例如:
# Windows: font_path = 'C:/Windows/Fonts/simhei.ttf'
# macOS: font_path = '/System/Library/Fonts/PingFang.ttc'
# Linux: font_path = '/usr/share/fonts/truetype/wqy/wqy-microhei.ttc'
# 假设我用的是Windows系统,并且有SimHei字体
font_path = fm.findfont(fm.FontProperties(family='SimHei'))
if not font_path:
# 如果找不到SimHei,尝试找其他常用字体,或者手动指定一个已知路径
# 这里只是一个示例,实际应用中你可能需要更健壮的查找逻辑
print("Warning: SimHei not found. Trying Microsoft YaHei...")
font_path = fm.findfont(fm.FontProperties(family='Microsoft YaHei'))
if not font_path:
print("Error: No suitable Chinese font found. Please specify manually.")
# Fallback to a default, likely garbled
font_prop = None
else:
font_prop = fm.FontProperties(fname=font_path)
else:
font_prop = fm.FontProperties(fname=font_path)
# 确保负号显示正常,这通常是全局设置,但也可以在局部文本中指定
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(8, 6))
plt.plot(np.random.rand(10), label='随机数据')
# 局部设置标题字体
if font_prop:
plt.title('这是一个局部设置的中文标题', fontproperties=font_prop, fontsize=16)
else:
plt.title('这是一个局部设置的中文标题 (字体缺失)', fontsize=16)
# 局部设置X轴标签字体
if font_prop:
plt.xlabel('X轴标签', fontproperties=font_prop, fontsize=12)
else:
plt.xlabel('X轴标签 (字体缺失)', fontsize=12)
# 局部设置Y轴标签字体,这里假设用默认英文字体,就不指定fontproperties了
plt.ylabel('Y轴标签', fontsize=12)
# 局部设置图例字体
if font_prop:
plt.legend(title='图例', prop=font_prop) # 注意图例的字体参数是prop
else:
plt.legend(title='图例 (字体缺失)')
plt.grid(True)
plt.show()这种方法的好处是,你可以非常精细地控制每个文本元素的字体,而不会影响到整个图表的其他默认文本。比如,如果你想在图表里同时显示英文和中文,并且希望它们分别使用不同的字体风格,局部设置就非常方便。缺点是代码会稍微多一些,每次都要指定fontproperties。我通常会在需要混合字体时使用它,如果整个图表都是中文,那还是全局配置来得直接。
配置中文字体后,为什么负号(-)也可能显示异常?如何解决?
我遇到过不少朋友,在辛辛苦苦配置好中文字体后,发现图表里的负号(-)却变得怪怪的,有时候是一个小方块,有时候是两个短横线连在一起,总之就是不正常。这其实是Matplotlib在处理Unicode字符时的一个小“陷阱”。
当我们将font.sans-serif设置为中文字体后,Matplotlib会尝试使用这个中文字体来渲染所有的文本,包括负号。问题在于,一些中文字体中的负号字符(Unicode U+2212)可能与我们习惯的英文字体中的负号(ASCII U+002D)在字形上有所不同,或者在某些渲染环境下表现不佳。更常见的情况是,Matplotlib的默认行为是尝试使用Unicode的“减号”字符(U+2212),而这个字符在某些字体中显示效果可能不如ASCII的“连字符-减号”(U+002D)美观,甚至会出问题。
解决这个问题非常简单,Matplotlib为此提供了一个专门的配置参数:axes.unicode_minus。
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import numpy as np
# 假设已经配置好了中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 替换为你的中文字体
fm._rebuild() # 清除缓存
# 关键在这里:设置axes.unicode_minus为False
# 告诉Matplotlib不要使用Unicode减号,而是使用ASCII的连字符-减号
plt.rcParams['axes.unicode_minus'] = False
# 示例绘图,包含负数
plt.figure(figsize=(8, 6))
x = np.arange(-5, 5, 0.5)
y = x**2 - 10
plt.plot(x, y, label='y = x^2 - 10')
plt.title('带有负号的中文标题')
plt.xlabel('X轴 (包含负值)')
plt.ylabel('Y轴 (包含负值)')
plt.legend(title='图例')
plt.grid(True)
plt.show()通过将plt.rcParams['axes.unicode_minus']设置为False,我们实际上是告诉Matplotlib,在显示负号时,回退到使用标准的ASCII连字符-减号(-),而不是尝试使用Unicode的减号字符。这个ASCII字符在绝大多数字体中都有良好支持,并且显示效果是我们所习惯的。所以,这几乎是一个在配置中文字体时必做的“配套”设置,能避免很多不必要的视觉困扰。
我已经配置了字体,为什么还是乱码?常见的排查步骤有哪些?
我发现,即使是经验丰富的开发者,在Matplotlib字体配置上偶尔也会遇到“明明设置了,却还是不行”的情况。这种时候,我通常会按以下步骤进行排查,这就像医生看病,一步步缩小范围。
清除Matplotlib字体缓存: 这是最常见也最容易被忽视的一步。Matplotlib为了提高性能,会缓存它找到的字体信息。如果你修改了字体配置,但没有清除缓存,Matplotlib可能还在使用旧的缓存信息。
import matplotlib.font_manager as fm fm._rebuild() # 这行代码非常关键!
执行这行代码后,最好重启你的Python环境(比如Jupyter Notebook的Kernel,或者VS Code的Python解释器),确保所有的缓存都彻底刷新。
确认你指定的字体名称是否正确且存在: 你写的
['SimHei']真的在你的系统上吗?而且名称拼写对吗?一个字母的错误都可能导致找不到字体。- 在Windows上: 检查
C:\Windows\Fonts目录,看看字体文件的属性,确认其“字体名称”。 - 在macOS上: 打开“字体册”应用,查看字体名称。
- 在Linux上: 使用
fc-list :lang=zh命令,看看输出列表中是否有你想要的字体名称。 - 你也可以用Matplotlib自己的工具来验证:
import matplotlib.font_manager as fm # 尝试查找你指定的字体 font_path = fm.findfont(fm.FontProperties(family='SimHei')) if font_path: print(f"找到字体SimHei,路径:{font_path}") else: print("未找到字体SimHei,请检查名称或是否安装。")如果
font_path是空的,那说明Matplotlib根本没找到你说的那个字体。
- 在Windows上: 检查
检查
rcParams是否真的生效: 有时候代码顺序或者其他地方的覆盖,可能导致你的rcParams设置没有真正应用。import matplotlib.pyplot as plt print(plt.rcParams['font.sans-serif']) print(plt.rcParams['axes.unicode_minus'])
运行这段代码,确认输出的结果是你期望的字体列表和
False。如果不是,那说明你的设置代码可能被其他地方覆盖了,或者在导入Matplotlib之后才设置,但某些模块已经使用了默认配置。确认你的Python环境: 如果你在虚拟环境(venv, conda env)中工作,确保你安装的Matplotlib和运行代码的解释器都在同一个环境中。有时候,系统环境安装了字体,但虚拟环境里的Matplotlib却找不到。
字体文件权限问题(Linux/macOS): 在Linux或macOS上,如果字体文件安装在非标准路径,或者权限设置不当,Matplotlib可能无法读取。确保字体文件对运行Python的用户是可读的。
代码编码问题(较少见但有可能): 虽然中文乱码通常是字体问题,但如果你的Python源文件本身编码不是UTF-8,或者在读取包含中文的数据时编码处理不当,也可能间接导致乱码。确保你的Python文件顶部有
# -*- coding: utf-8 -*-声明(Python 3默认就是UTF-8,所以通常不是问题),并且所有涉及中文的字符串都是UTF-8编码。重启IDE或Jupyter Kernel: 我发现很多时候,简单的重启Jupyter Notebook的Kernel或者VS Code的Python解释器,就能解决一些莫名其妙的字体问题。这能确保所有的模块都重新加载,避免旧状态的影响。
通过这些步骤,我通常都能定位到问题所在。记住,这是一个系统性的排查过程,不要跳过任何一步。
理论要掌握,实操不能落!以上关于《Matplotlib中文显示乱码解决方法》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
小红书解绑设备步骤及安全操作指南
- 上一篇
- 小红书解绑设备步骤及安全操作指南
- 下一篇
- Windows10更改系统名称教程
-
- 文章 · python教程 | 25分钟前 |
- Python字符串替换实用技巧分享
- 326浏览 收藏
-
- 文章 · python教程 | 31分钟前 |
- Python日期格式解析与验证技巧
- 220浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- PythonOpenCV像素操作教程
- 362浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python条件优化:告别嵌套if-else陷阱
- 147浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Pandas与NumPyNaN查找区别详解
- 278浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python中type函数的作用是什么
- 393浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- 多进程处理大数据的实用技巧
- 330浏览 收藏
-
- 文章 · python教程 | 10小时前 |
- PandasDataFrame列赋值NaN方法解析
- 205浏览 收藏
-
- 文章 · python教程 | 10小时前 |
- Python元组括号用法与列表推导注意事项
- 143浏览 收藏
-
- 文章 · python教程 | 11小时前 |
- ib\_insync获取SPX历史数据教程
- 395浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3168次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3381次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3410次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4514次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3790次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览

