Matplotlib 中文显示(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Python 的数据可视化领域,Matplotlib 是一款功能强大且广泛使用的库。然而,对于许多开发者而言,中文字符在图表中显示为乱码或缺失的问题常常令人困扰。无论是绘制柱状图、折线图还是热力图,清晰的中文标签和标题都是提升图表可读性的重要环节。本文将从问题根源出发,逐步讲解如何解决 Matplotlib 中文显示问题,并提供实际案例和代码示例,帮助读者轻松掌握这一技能。
一、为什么 Matplotlib 会出现中文显示问题?
1.1 编码与字体缺失的双重挑战
Matplotlib 默认使用系统默认字体进行渲染,但许多操作系统的默认字体库中并不包含中文字体。当尝试显示中文时,程序会因找不到合适的字体文件而显示乱码或方框。这类似于在英文操作系统中尝试阅读中文文档,如果没有安装对应的字体,内容将无法正确呈现。
1.2 不同操作系统下的差异
Windows、macOS 和 Linux 系统对字体的管理方式不同,因此中文显示问题的具体解决方案也会有所差异。例如,Windows 系统通常需要手动指定中文字体名称,而 macOS 可能仅需调整配置文件。
二、快速解决方案:手动设置字体
2.1 单次图表的临时设置
对于偶尔需要中文显示的场景,可以在代码中直接指定中文字体。例如:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
plt.plot([1, 2, 3], [4, 5, 6])
plt.title("这是一个中文标题")
plt.xlabel("X轴标签")
plt.ylabel("Y轴标签")
plt.show()
关键点解释:
plt.rcParams['font.sans-serif']
控制无衬线字体的默认值,将中文字体名称(如 "SimHei")加入列表即可。axes.unicode_minus
需要单独设置为False
,否则负号(-)会显示为方框。
2.2 永久配置文件修改
如果希望所有 Matplotlib 图表默认支持中文,可以修改其配置文件 matplotlibrc
。步骤如下:
- 找到配置文件路径:
import matplotlib print(matplotlib.matplotlib_fname())
- 打开文件并修改以下两行:
font.family : sans-serif font.sans-serif : SimHei, DejaVu Sans, Bitstream Vera Sans, ... axes.unicode_minus : False
三、进阶技巧:自定义字体与系统适配
3.1 根据操作系统动态选择字体
不同系统中字体名称可能不同,例如:
- Windows:常用 "SimHei"(黑体)、"Microsoft YaHei"(微软雅黑)
- macOS:默认支持 "PingFang SC" 或 "Arial Unicode MS"
- Linux:需安装中文字体包(如 WenQuanYi)
可以通过 Python 代码自动适配:
import sys
if sys.platform == 'win32':
font = 'SimHei'
elif sys.platform == 'darwin':
font = 'PingFang SC'
else:
font = 'WenQuanYi Zen Hei'
plt.rcParams['font.sans-serif'] = [font]
3.2 自定义字体文件路径
如果系统中没有所需字体,可以手动下载并指定路径。例如:
from matplotlib.font_manager import FontProperties
font_path = '/path/to/SimHei.ttf' # 替换为实际路径
prop = FontProperties(fname=font_path)
plt.title("自定义字体示例", fontproperties=prop)
四、常见问题排查与解决
4.1 乱码问题
现象:中文显示为方框或问号。
原因:字体名称错误或字体文件未正确加载。
解决方案:
- 确认字体名称是否正确。可以通过以下代码查看系统支持的字体:
import matplotlib.font_manager as fm [f.name for f in fm.fontManager.ttflist if 'hei' in f.name.lower()]
- 检查字体文件路径是否有效。
4.2 负号显示异常
现象:坐标轴上的负号(-)显示为方框。
解决方法:
plt.rcParams['axes.unicode_minus'] = False
4.3 保存图片后中文消失
原因:保存图片时未指定正确的字体渲染方式。
解决方案:
在保存时添加 bbox_inches='tight'
或指定 dpi:
plt.savefig("chart.png", dpi=300, bbox_inches='tight')
五、完整案例:绘制中文饼图
import matplotlib.pyplot as plt
import sys
if sys.platform == 'win32':
font = 'SimHei'
else:
font = 'PingFang SC'
plt.rcParams['font.sans-serif'] = [font]
plt.rcParams['axes.unicode_minus'] = False
labels = ['苹果', '香蕉', '橘子', '葡萄']
sizes = [25, 30, 15, 30]
fig, ax = plt.subplots()
ax.pie(sizes, labels=labels, autopct='%1.1f%%')
ax.set_title("水果销量占比分析")
plt.show()
输出效果:
- 饼图各扇形区域标注中文标签
- 标题和百分比显示正常
六、总结与扩展
通过本文的讲解,读者应能掌握 Matplotlib 中文显示的核心方法,并根据实际场景选择临时设置或永久配置。以下是关键总结:
- 问题本质:字体缺失与编码兼容性问题。
- 解决思路:指定中文字体名称或路径,并处理负号显示。
- 扩展方向:
- 使用
font_manager
实现动态字体加载 - 结合 Seaborn 等高级库时同步设置字体
- 在 Jupyter Notebook 中配置默认字体
- 使用
掌握这一技能后,开发者可以更加专注于数据本身,而无需为图表的中文显示问题反复调试。希望本文能成为您 Python 可视化之路的实用指南。
关键词布局回顾:Matplotlib 中文显示、中文乱码、字体设置、负号显示、系统适配、永久配置、代码示例、解决方案、常见问题、饼图案例。