【实战技巧】matplotlib中文标签显示异常的3种修复方案

1. 问题重现:为什么我的图表变成了“豆腐块”?

刚接触matplotlib那会儿,我画了个带中文标题的图,满心期待地运行,结果屏幕上蹦出来的不是“sigmoid函数”,而是一堆方方正正的“口口口”,或者干脆就是空白。当时我就懵了,代码明明没错啊,数据也对,怎么中文就“隐身”了呢?相信很多刚开始用Python做数据可视化的朋友都踩过这个坑。

这个问题说白了,就是matplotlib这个“画图工具”在默认情况下,不认识咱们的中文字符。它内置的字体库主要是为英文设计的,当你告诉它“请在这里写上‘中文’两个字”时,它翻遍了自带的字体库,找不到对应的字形,就只能用默认的“占位符”(通常是空白或方块)来显示,这就是我们看到的乱码或者“豆腐块”。

比如下面这段再经典不过的代码,用来画sigmoid函数曲线:

import numpy as np
import matplotlib.pyplot as plt

z = np.arange(-5, 5, .1)
sigma = 1 / (1 + np.exp(-z))

fig, ax = plt.subplots()
ax.plot(z, sigma)
ax.set_xlabel('自变量 z')
ax.set_title('sigmoid 激活函数曲线')
ax.grid(True)

plt.show()

如果你在Jupyter Notebook或者PyCharm里直接运行,十有八九那个“自变量 z”的x轴标签和“sigmoid 激活函数曲线”的标题,会显示异常。这跟你的操作系统是Windows、macOS还是Linux关系不大,核心原因在于matplotlib的字体配置。这个问题在需要生成报告、制作演示文稿,或者任何需要清晰展示中文信息的场景下,都非常恼人。别担心,接下来我就分享三种我用了很多年、百试百灵的修复方案,从最推荐的一劳永逸法,到临时救急的快速方案,总有一款适合你。

2. 方案一:一劳永逸——配置系统支持的中文字体(最推荐)

这是我个人最推崇的方法,因为它从根本上解决了问题。思路很简单:告诉matplotlib,“别用你自带的那套英文字体了,去用我电脑里这个能显示中文的字体文件”。这样做的好处是,一次配置,终身受益,以后所有脚本里的中文都能正常显示,而且字体风格统一美观。

2.1 找到你的中文字体

首先,你得知道你系统里有哪些好看又支持中文的字体。不同系统字体存放的位置不一样:

  • Windows:字体通常都在 C:\Windows\Fonts\ 目录下。你可以直接打开这个文件夹,里面能看到所有已安装的字体。常用的中文字体有:SimHei(黑体)、Microsoft YaHei(微软雅黑)、SimSun(宋体)、KaiTi(楷体)等。记住你喜欢的字体文件名(不带后缀),比如 msyh.ttc 对应的就是“Microsoft YaHei”。

  • macOS:字体在 /Library/Fonts/(系统级)或 ~/Library/Fonts/(用户级)。macOS自带了一些不错的中文字体,如 PingFang SC(苹方)、STHeiti(华文黑体)、Songti SC(宋体)等。你可以用“字体册”应用来查看和管理。

  • Linux:字体路径可能包括 /usr/share/fonts/~/.fonts/ 等。常见的中文字体包如 wqy-microhei(文泉驿微米黑),可能需要用包管理器安装,例如Ubuntu下可以运行 sudo apt install fonts-wqy-microhei

2.2 修改matplotlib的配置文件(rcParams)

找到字体名后,我们可以在Python脚本的开头,通过修改matplotlib的运行时配置参数(rcParams)来指定字体。这是最直接的方法:

import matplotlib.pyplot as plt
import numpy as np

# 方案1.1:直接指定字体族
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'KaiTi']  # 指定字体,优先使用第一个
plt.rcParams['axes.unicode_minus'] = False  # 解决负号'-'显示为方块的问题

# 然后正常绘图
z = np.arange(-5, 5, .1)
sigma = 1 / (1 + np.exp(-z))

fig, ax = plt.subplots()
ax.plot(z, sigma)
ax.set_xlabel('自变量 z')
ax.set_title('sigmoid 激活函数曲线')
ax.grid(True)

plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值