Matplotlib 中文显示(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 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。步骤如下:

  1. 找到配置文件路径:
    import matplotlib  
    print(matplotlib.matplotlib_fname())  
    
  2. 打开文件并修改以下两行:
    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 乱码问题

现象:中文显示为方框或问号。
原因:字体名称错误或字体文件未正确加载。
解决方案

  1. 确认字体名称是否正确。可以通过以下代码查看系统支持的字体:
    import matplotlib.font_manager as fm  
    [f.name for f in fm.fontManager.ttflist if 'hei' in f.name.lower()]  
    
  2. 检查字体文件路径是否有效。

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 中文显示的核心方法,并根据实际场景选择临时设置或永久配置。以下是关键总结:

  1. 问题本质:字体缺失与编码兼容性问题。
  2. 解决思路:指定中文字体名称或路径,并处理负号显示。
  3. 扩展方向
    • 使用 font_manager 实现动态字体加载
    • 结合 Seaborn 等高级库时同步设置字体
    • 在 Jupyter Notebook 中配置默认字体

掌握这一技能后,开发者可以更加专注于数据本身,而无需为图表的中文显示问题反复调试。希望本文能成为您 Python 可视化之路的实用指南。


关键词布局回顾:Matplotlib 中文显示、中文乱码、字体设置、负号显示、系统适配、永久配置、代码示例、解决方案、常见问题、饼图案例。

最新发布