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()


4万+

被折叠的 条评论
为什么被折叠?



