拓之

拓之

matplotlib中文乱码问题

2023-11-01

一、背景

Matplotlib是Python中最常用的数据可视化库之一,它允许用户创建各种类型的图表和图形以呈现数据。然而,对于那些需要在图表中包含中文文本的用户来说,Matplotlib可能会带来一些问题,因为默认情况下,Matplotlib在处理中文文本时常常会出现乱码的情况。比如下面这种情况

乱码图片

二、原因

问题的根本在于Matplotlib的默认字体设置。Matplotlib使用默认字体来呈现文本,而这些字体不一定包含中文字形。所以在图表中添加中文文本时,Matplotlib可能会无法正确显示这些字符,从而导致乱码。

因此,我们只需要解决字体的问题,就可以解决字体乱码的问题了。下面我们来一起解决这个问题

三、解决方法

这里我们分别给出windows和mac的解决方案,两者有一点区别。

1. windows解决方案

对于windows的处理方法比较简单,只需要设置好有中文的字体就可以了

import matplotlib.pyplot as plt
​
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置字体为黑体
plt.rcParams["axes.unicode_minus"] = False  # 该语句解决图像中的“-”负号的乱码问题

这里我们把字体设置的是黑体,黑体是win自带的字体,所以这里这样设置,下面我们设置的中文图注,中文标题都可以正常显示出来了。

注意这里设置要写对应的英文名,常见的对应字体名字可以看下表

字体

英文名

宋体

SimSun

黑体

SimHei

微软雅黑

Microsoft Yahei

微软正黑体

Microsoft JhengHei

楷体

KaiTi

新宋体

NSimSun

仿宋

FangSong

其他字体的对应名我们可以去C:\Windows\Fonts文件夹中查看,里面非常全。

2. Mac或linux解决方案

mac和linux的解决方案其实是和win类似的,我们只需要设置有中文的字体就可以了,但是区别在于mac和win的默认字体不太一样,就比如我们刚设置的黑体在mac上就没有,而mac上有华文黑体,对应的英文名是STHeiti

import matplotlib.pyplot as plt
​
plt.rcParams["font.sans-serif"] = ["STHeiti"]  # 设置字体为华文黑体
plt.rcParams["axes.unicode_minus"] = False  # 该语句解决图像中的“-”负号的乱码问题

这里同样给出一些常用的字体

字体

英文名

苹方

PingFang SC

华文黑体

STHeiti

华文楷体

STKaiti

华文宋体

STSong

华文仿宋

STFangsong

这里就会带来一个问题,win和mac的字体是不一样的,所以我们在win运行的好好的代码,放在mac或者linux中就乱码了,就是因为他们的字体库是不一样的。下面我们就介绍如何解决这个问题

3. mac安装字体

解决方法很简单,我们把需要的字体安装一下就可以了。

首先下载一下需要的字体,这里以黑体举例,点击这里下载win黑体的字体文件。其他字体文件我们可以去百度或谷歌搜索。

image-20231031223410980

下载下来之后,我们双击这个文件,就会弹出安装界面。

image-20231031223440931

这里点击安装就可以了。

安装好了之后,我们去把matplotlib的缓存文件清理一下,因为他记录的还是上次的字体列表。

一般没有改过的默认地址应该是在~/.matplotlib,我们直接在终端输入下面的命令,也可以手动去这个文件夹删,这里我就不演示了。

rm -rf ~/.matplotlib/*

到这里我们就配置好了,到python里面来,我们设置为黑体

import matplotlib.pyplot as plt
​
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置字体为黑体
plt.rcParams["axes.unicode_minus"] = False  # 该语句解决图像中的“-”负号的乱码问题

随便画一个图

image-20231031225027514

完美!!

四、单独配置字体(补充)

之前我们给出的设置字体方式是都是全局设置,也是就是所有字体都设置为这个了,这带来的问题就是可能英文字体显示的不是太好看。我们可以用下面的方式对每个字体进行单独配置。

import matplotlib.pyplot as plt
​
plt.xlabel("x轴")
plt.ylabel("y轴", fontproperties="SimSun") #设置字体为宋体
plt.title("标题", fontproperties="SimHei") #设置字体为黑体
plt.show()

这种方式就是可以高度自定义,为每个文字设置单租的字体。

相对来说,全局设置比较方便,一次设置,全局应用。局部设置就是要对每个都进行单独的设置。

五、总结

总之就是字体的问题,只要设置好了字体,就可以正常显示了。有这个字体我们就直接设置,没有我们就去下载。

六、参考文章

  1. matplotlib正确显示中文的四种方式 显示中文乱码

  2. matplotlib中文乱码的两种解决方案

  3. matplotlib中文文档