相信有很多人曾经被matplotlib画图的中文显示问题所困扰,包括我自己。每次生产环境发生改变,都会遭遇到这个问题,然后需要花大量的时间在它上边。最可气的是每次遇到的问题不一定一样,上一次使用的方法不一定适用。网上的教程很多,但没有看到一个完整的、必杀的解决方案。

我在花了大量时间进行多次尝试之后,总结出了一套流程,截止目前我遇到过的所有的不同环境下(Linux + Mac)的matplotlib中文显示问题都得到了完美解决,因此整理出来分享给大家,希望能让大家少走弯路,把时间花在更有价值的地方。

刚好我购置了一台腾讯云的服务器,我们就拿它为例,看一下如何配置。

首先我们安装好Python3+matplotlib,然后进入Python,画一张图来看看效果:

import matplotlib.pyplot as plt

plt.plot([1,3,2,4], '--r')

plt.title(u'测试')

plt.savefig('temp.png')

-w460

可以看到虽然我们为title设置了中文“测试”,但实际上显示出来的却是两个方框。好,那我们就开始解决这个问题。

第一步:确认系统字体

我们在命令行中通过fc-list :lang=zh来查看下系统是否有安装中文字体。

# root @ VM_0_16_centos in ~ [14:20:29]

$ fc-list :lang=zh

# root @ VM_0_16_centos in ~ [14:22:01]

$

我们看到输出为空,这说明我们的Linux系统暂时没有安装中文字体,我们需要进行安装。老版本有很多种安装方法,有一些甚至需要root权限,这一点很不友好。因为很多朋友的服务器是公司提供的,出于安全考虑,普通技术员工并没有root权限。

好在现在绝大多数的linux版本都已经可以非常快速地通过复制文件的方式来安装字体了。

我们先下载喜欢的中文字体,比如黑体、楷体和微软雅黑。下载好之后,我们将文件上传到服务器,并移动到个人目录下的.fonts文件夹内。

然后,我们再检查一下:

# root @ VM_0_16_centos in ~ [14:27:46]

$ fc-list :lang=zh

/root/.fonts/msyh.ttf: 微软雅黑,Microsoft YaHei:style=Regular

/root/.fonts/simhei.ttf: 黑体,SimHei:style=Regular,Normal,obyčejné,Standard,Κανονικά,Normaali,Normál,Normale,Standaard,Normalny,Обычный,Normálne,Navadno,Arrunta

/root/.fonts/simkai.ttf: 楷体_GB2312,KaiTi_GB2312:style=Regular

可以看到,我们已经成功地将三个中文字体安装到了系统中,是不是很简单快速?

第二步:安装matplotlib字体支持

接下来我们要在matplotlib中安装中文字体(这一步在有些教程里是不需要的,但是时灵时不灵,我们最好也安装一下。),这一步需要我们先确认字体的安装目录。

In [9]: import matplotlib as mpl

In [10]: mpl.matplotlib_fname()

Out[10]: '/usr/local/lib64/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc'

我们看到了matplotlib的配置文件的地址,记住这个地址,后边修改配置时要用到。现在我们用它来定位字体文件夹。我们进入配置文件所在目录:

# root @ VM_0_16_centos in ~ [14:41:22] C:1

$ cd /usr/local/lib64/python3.6/site-packages/matplotlib/mpl-data/

# root @ VM_0_16_centos in /usr/local/lib64/python3.6/site-packages/matplotlib/mpl-data [14:41:24]

$ ll

总用量 52K

drwxr-xr-x 5 root root 4.0K 11月 30 14:03 fonts

drwxr-xr-x 2 root root 4.0K 11月 30 14:03 images

-rw-r--r-- 1 root root 33K 11月 30 14:03 matplotlibrc

drwxr-xr-x 3 root root 4.0K 11月 30 14:03 sample_data

drwxr-xr-x 2 root root 4.0K 11月 30 14:03 stylelib

# root @ VM_0_16_centos in /usr/local/lib64/python3.6/site-packages/matplotlib/mpl-data [14:41:25]

$ cd fonts

# root @ VM_0_16_centos in /usr/local/lib64/python3.6/site-packages/matplotlib/mpl-data/fonts [14:41:29]

$ ll

总用量 12K

drwxr-xr-x 2 root root 4.0K 11月 30 14:03 afm

drwxr-xr-x 2 root root 4.0K 11月 30 14:03 pdfcorefonts

drwxr-xr-x 2 root root 4.0K 11月 30 14:03 ttf

# root @ VM_0_16_centos in /usr/local/lib64/python3.6/site-packages/matplotlib/mpl-data/fonts [14:41:31]

$ cd ttf

# root @ VM_0_16_centos in /usr/local/lib64/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf [14:41:33]

$ ll

总用量 6.7M

-rw-r--r-- 1 root root 26K 11月 30 14:03 cmb10.ttf

-rw-r--r-- 1 root root 21K 11月 30 14:03 cmex10.ttf

-rw-r--r-- 1 root root 32K 11月 30 14:03 cmmi10.ttf

-rw-r--r-- 1 root root 26K 11月 30 14:03 cmr10.ttf

-rw-r--r-- 1 root root 20K 11月 30 14:03 cmss10.ttf

-rw-r--r-- 1 root root 29K 11月 30 14:03 cmsy10.ttf

-rw-r--r-- 1 root root 28K 11月 30 14:03 cmtt10.ttf

......

好了,接下来我们将刚才的字体文件复制过来即可。

第三步:修改matplotlib配置文件

我们先关闭所有的Python程序,包括Python、IPython、Jupyter等,因为一会儿修改完之后需要清空缓存并重启程序生效。

还记得刚才的matplotlibrc的地址吧,我们用趁手的文本编辑器打开它,去掉如下三行开头的注释符,并在font.sans-serif的取值中,将我们刚才三个字体的英文名称添加到最前边。英文名称在我们刚才使用fc-list :lang=zh时可以看到。

axes.unicode_minus : True

font.family : sans-serif

font.sans-serif : Microsoft YaHei, SimHei, KaiTi_GB2312, DejaVu Sans, Bitstream Vera Sans, ...

保存退出。

这一步需要注意的是,如果你的系统中存在多个Python环境,那一定要确保你安装的字体以及修改的配置文件是你要使用的那一个环境中的。

第四步:删除缓存

不删除缓存的话,在代码中指定字体文件或字体名称理论上也可以使用,但这样太麻烦 ,我们要解决就解决彻底。

一般情况下,缓存在~/.cache/matplotlib目录下,但也有些会在~/.matplotlib目录下(我的Mac是这样的),不管在哪里,我们直接清除掉这个目录即可。

rm -rf ~/.cache/matplotlib

或者

rm -rf ~/.matplotlib

第五步:重启Python程序

现在我们重新打开我们的Python程序,检查一下是否已经好了。

import matplotlib.pyplot as plt

plt.plot([1,3,2,4], '--r')

plt.title(u'测试')

plt.savefig('temp.png')

-w460

大功告成,我们的title成功地显示出来了。

第六步:针对Python2的补充

另外说一点,由于Python2默认的编码方式并不是UTF-8,因此在Python2中,我们要在字符串之前添加u,强制将字符串以Unicode方式编码。如上例,在Python2中,我们应该使用u"测试"。

以上就是我梳理的完整的解决流程,如有严格按照此流程操作仍不能解决的,可以联系我,我们一起探讨。

python汉字无法显示图片_完美解决matplotlib画图中文显示问题相关推荐

  1. 网页突然乱码_如何解决HTML网页中文显示乱码的方法

    "无忧主机解决php网页中文显示乱码问号( ? ? ? )的一些意见"这是我在上篇中介绍的关于如何解决网页显示乱码的问题,这是在动态网站下发生的.在纯html网页下,会不会也存在的 ...

  2. python循环输入若干成绩_完美解决在oj中Python的循环输入问题

    完美解决在oj中Python的循环输入问题 这几天做题被python的循环输入问题给烦死了,好好查了一下,记录在此. while True: t= sys.stdin.readline().strip ...

  3. python怎么在gui中显示图片_用 PySimpleGUI 做程序(7)--显示图片

    欢迎关注深入 Python 的专栏:恍然大明白​www.zhihu.com 本文代码在此:https://github.com/JiangChuanGo/examples/tree/master/Py ...

  4. Python 3下Matplotlib画图中文显示乱码的解决方法

    解决办法: 因为乱码是Matplotlib缺少中文配置所导致的,所以我们只需要在程序中说明使用中文字体即可. 先选一个字体.在计算机中找到字体,选择一种中文字体,比如我这里用的是楷体 右键可以查看其属 ...

  5. Win10下Python实现动态条形图(附解决matplotlib画图中文乱码问题)

    1.安装最新的bar-chart-race包0.2版本 从GitHub上下载压缩包,将解压后的文件夹放置在项目的创建的–虚拟环境/lib/python3.7/site-packages目录下. htt ...

  6. matplotlib画图中文显示问题

    matplotlib不支持中文显示,以下以画一个cos函数为例 代码如下: import matplotlib.pyplot as plt import numpy as npx = np.linsp ...

  7. python可视化的图表汉字显示成框框_数据可视化——Matplotlib输出中文显示问题...

    写在前面 在学习可视化过程中,Matplotlib是其余Python可视化工具包的基础,是它们的老祖宗. Matplotlib是一个用于绘制高质量图形的Python第三方包,一般将其简写成mpl(ma ...

  8. jdbc mysql查询显示图片_在实现JDBC时如何显示存储引擎-MySQL CONNECTION查询?

    使用SELECT ENGINE显示存储引擎名称.让我们首先创建一个表-create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREME ...

  9. python饼图显示数量_如何在matplotlib饼图中显示实际值(Python)?

    使用autopct关键字 我们知道显示的百分比乘以所有实际值之和必须是实际值,我们可以将其定义为一个函数,并使用autopct关键字将此函数提供给plt.pie.import matplotlib.p ...

最新文章

  1. 开发日记-20190617 关键词 bash命令尝试模拟点击事件
  2. CodeForces - 1465E Poman Numbers(推公式+贪心)
  3. SVN trunk branch tags 区别
  4. html页面返回原理,浏览器输入URL到界面显示(HTML渲染)发生了什么?
  5. Rsync常见错误及命令详细参数
  6. mysql密码登陆过程_mysql单实例忘记密码如何登陆过程
  7. Android Monkey Test
  8. HMC5883l磁力计数据读取
  9. oracle 体系架构图
  10. ISTP概况及网络版检索方法
  11. html富强民主鼠标特效,给网站添加鼠标点击特效富强、民主、和谐 js效果 - 寒星皓月...
  12. html语法在线检测,HTML语法检测
  13. 用python画一个蜡笔小新
  14. 金仓数据库KingbaseES客户端编程接口指南-ODBC(6. KingbaseES ODBC 的扩展属性)
  15. 如何恢复硬盘数据,包括硬盘文件名乱码
  16. 程序员有前途吗?出路在哪里?
  17. PHP生成海报 文字描边,海报字体 怎么为海报字体添加描边样式?海报文字描边怎么做?海报字体描边样式制作...
  18. Android开发浅谈:关于如何把手机壳颜色设置为我们App的主题颜色
  19. PS多媒体教程带你享受快乐学习
  20. XPS—专项文献阅读

热门文章

  1. 检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误:80070005 拒绝访问
  2. 电脑一般预装access吗_win7自带access数据库
  3. idea 使用SVN导出项目
  4. 计算机共享链接出问题了,电脑打印机共享连接出现故障, 赶紧按照以下操作试试...
  5. Office彩蛋 关于office中隐藏的小秘密(或小游戏)
  6. 纽约警察局从社交网络中数据挖掘犯罪活动信息
  7. 论文导读 | 基于注意力机制对齐增强预训练语言模型
  8. 用C语言模拟实现字符函数与字符串函数
  9. word怎么竖向选中_word垂直选取 word中怎么垂直选中文字
  10. 聊一聊行业的前景、就业方向和薪资待遇