前言

最近在搞数据可视化的一些案例,特地来把学习过程中遇到的一些小问题记录一下。

今天遇到一个问题就是:当我给坐标轴添加一些中文内容以便客户查看时,出现了乱码,接下来我就通过两种方法对乱码的问题做一下解释。

中文乱码的解决方案

01 - 出错原因

我们先来看一段简单的演示代码:

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. x \= np.linspace(0.05,10,1000)
  4. y \= np.cos(x)
  5. plt.plot(x,y,ls\="-",lw\=2,label \= "plot figure")
  6. plt.legend()
  7. plt.xlabel("这是x轴")
  8. plt.ylabel("这是y轴")
  9. plt.show()

代码很简单,这里不再赘述,我们直接看效果:

matplotlib中文乱码的两种解决方案 - 云 社区 - 腾讯云 - 图1

我们发现,除了大大的报红信息之外,对于坐标轴的中文解释内容也出现了乱码现象。ok,找出了问题,接下来我们就来看看解决办法。

02 - 通过代码解决

首先,第一种方法,在每次写代码之前,我们加入如下两行代码:

  1. plt.rcParams\['font.sans-serif'\]\=\['SimHei'\] #用来正常显示中文标签
  2. plt.rcParams\['axes.unicode\_minus'\] \= False #用来正常显示负号

加入这两行代码之后我们发现,所得结果仍然还有乱码现象,这里说一下,我在很多书中的演示代码也看到,作者只是添加了这两行代码,这并没有结束,我们在输入中文字符的时候,还应该在中文字符前加上 u ,即正确格式为:u’内容’ 。

我们来看完整的代码:

  1. \# \-\*\- coding: utf\-8 \-\*\-
  2. """
  3. @author: 石璞东(微信公众号:hahaCoder)
  4. @software: PyCharm
  5. @file: 01.py
  6. @time: 2020/8/16 12:24 上午
  7. """
  8. import matplotlib.pyplot as plt
  9. import numpy as np
  10. plt.rcParams\['font.sans-serif'\]\=\['SimHei'\] #用来正常显示中文标签
  11. plt.rcParams\['axes.unicode\_minus'\] \= False #用来正常显示负号
  12. x \= np.linspace(0.05,10,1000)
  13. y \= np.random.randn(1000)
  14. plt.plot(x,y,label\="scatter figure")
  15. plt.legend()
  16. plt.xlabel(u"这是x轴")
  17. plt.ylabel(u"这是y轴")
  18. plt.show()

我们再来看效果展示:

matplotlib中文乱码的两种解决方案 - 云 社区 - 腾讯云 - 图2

哈哈哈,乱码问题被解决咯,不过细心的小伙伴会发现,每次写代码,都要把这两行代码加进去,而且还要在中文内容前加 u ,这可太麻烦了,所以我给小伙伴们介绍了第二种一劳永逸的方法,快来看看吧~

03 - 修改配置文件,一劳永逸的方法

1. 首先,我们下载 SimHei 字体(即 SimHei.tff 包),小伙伴们可在官网下载,也可在我推荐的如下地址去下载:

http://www.xiazaiziti.com/210356.html

2. 下载好之后,我们找到 matplotlib 文件夹,如下图所示:

matplotlib中文乱码的两种解决方案 - 云 社区 - 腾讯云 - 图3

如果找不到 matplotlib 文件夹的小伙伴,可通过如下代码进行查看:

  1. import matplotlib
  2. print(matplotlib.get\_data\_path()) # 数据路径

我们重点关注 matplotlib 中的 ttf 文件夹和 matplotlibrc 文档。

第一步,我们将下载好的 SimHei.ttf 文件拷贝到 ttf 文件夹;

第二步,我们打开 matplotlibrc 文档,按照如下提示进行修改:

matplotlib中文乱码的两种解决方案 - 云 社区 - 腾讯云 - 图4

matplotlib中文乱码的两种解决方案 - 云 社区 - 腾讯云 - 图5

matplotlib中文乱码的两种解决方案 - 云 社区 - 腾讯云 - 图6

总结一下,共需要修改三条配置命令:

  1. font.family:sans\-serif
  2. font.sans\-serif:SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans\-serif
  3. axes.unicode\_minus:False,#作用就是解决负号'-'显示为方块的问题

提醒小伙伴一点,不要忘记去掉上述所修改三条配置命令前的 # 符号。

3. 修改完成配置文件之后,距离成功就差一步咯,我们现在只需要将我们刚刚拷贝的字体和设置的命令重新加载一下即可,我们可以通过如下命令进行设置:

  1. from matplotlib.font\_manager import \_rebuild
  2. \_rebuild() #reload一下

设置完成之后,我们无需引入其他代码,也无需在中文内容前加 u ,就可以正常显示中文内容啦,完整代码如下:

  1. \# \-\*\- coding: utf\-8 \-\*\-
  2. """
  3. @author: 石璞东(微信公众号:hahaCoder)
  4. @software: PyCharm
  5. @file: 01.py
  6. @time: 2020/8/16 12:24 上午
  7. """
  8. import matplotlib.pyplot as plt
  9. import numpy as np
  10. x \= np.linspace(0.05,10,1000)
  11. y \= np.random.randn(1000)
  12. plt.plot(x,y,label\="scatter figure")
  13. plt.legend()
  14. plt.xlabel(u"这是x轴")
  15. plt.ylabel(u"这是y轴")
  16. plt.show()

本文最后

在上述内容中,我介绍了两种解决 matplotlib 项目中可能遇到的中文乱码的问题,小伙伴们学会了吗?快去实践一下吧~

本文分享自微信公众号 - hahaCoder(hahaCoder),作者:石璞东

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
https://cloud.tencent.com/developer/article/1681381