解决Linux系统中python matplotlib画图的中文显示问题


Posted in Python onJune 15, 2017

最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些初步的数据挖掘和分析。

在使用matplotlib画图时,横坐标为中文,但是画出的条形图横坐标总是显示“框框”,就去查资料解决。感觉这应该是个比较常见的问题,网上的中文资料也确实很多,但是没有任何一个彻底解决了我遇到的问题。零零碎碎用了快3个小时的时间,才终于搞定。特此分享,希望能帮到有同样问题的童鞋。

运行环境:

  • python2.7
  • Linux Centos7
  • 用conda安装的matplotlib和pandas

问题:

  • matplotlib画图,无法显示中文

问题原因:

  • linux操作系统以及matplotlib的字体库中,没有可用的中文字体
  • matplotlib包默认只支持ASCII码,不支持unicode码

网上资料总结:

  • 修改matplotlib的资源配置文件,例如增加"Simhei"字体(这个字体并不是所有的linux系统都有的好嘛!修改了并没有作用)
  • 给linux安装中文字体,并修改matplotlib的资源配置文件。(呵呵,并没有作用)

解决方案:

其实也是综合了网上的各种解决方案。总体说来有以下几个步骤:

1. 获取matplotlibrc文件所在路径。在jupyter notebook中获取:

import matplotlib
matplotlib.matplotlib_fname()

例如,我的这个文件在:

u'~/miniconda2/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc'

后续步骤会修改此文件中的font参数。

2. 看看系统中的所有字体,以及可用的中文字体。也是在jupyter nb中:

from matplotlib.font_manager import FontManager
import subprocess
fm = FontManager()
mat_fonts = set(f.name for f in fm.ttflist)
print mat_fonts
output = subprocess.check_output(
  'fc-list :lang=zh -f "%{family}\n"', shell=True)
print '*' * 10, '系统可用的中文字体', '*' * 10
print output
zh_fonts = set(f.split(',', 1)[0] for f in output.split('\n'))
available = mat_fonts & zh_fonts
print '*' * 10, '可用的字体', '*' * 10
for f in available:
  print f

做完上述操作,会发现“可用的字体”这里为空。因为没有中文字体给matplotlib用(所以才会中文都显示“框框”)

3. 假设操作系统中没有中文字体。此时下载一个ttf中文字体,并在cenos中安装。要安装那种系统能检测font-family的,否则无效。我在这个网站下载的:http://font.chinaz.com/130130474870.htm

解压rar文件。在 /usr/share/fonts 路径下创建存放此字体的文件夹yourfontdir,并下载的ttf文件复制到yourfontdir中(可以给文件改个英文名,方便操作)

4. 给cenos安装这个字体。

cd /usr/share/fonts/yourfontsdir
#生成字体索引信息. 会显示字体的font-family
sudo mkfontscale
sudo mkfontdir
#更新字体缓存:
fc-cache

5. 修改matplotlibrc文件

修改步骤1中获取的matplotlibrc文件配置。

将font.family 部分注释去掉,并且在font.serif 支持字体加上一个中文字体。这里就加上刚才下载的中文字体的font-family. 可以通过 fc-list 命令查找一下(所以前面最好记下来)。我这里增加的是"WenQuanYi Zen Hei Mono"字体。

下面这句注释要去掉,不然中文减号也显示方块:

axes.unicode_minus : False

6. 这一步骤最重要!为matplotlib增加中文字体

完成步骤5后,再操作步骤2,会发现“可用的中文字体”已经有了刚才安装的字体,但是画图仍然不能显示中文。这是因为你这个字体给centos安装了、也告诉matplotlib要用这个字体了,但是,matplotlib找不到这个字体的ttf文件啊。。。。所以需要给它弄一个。

将下载的ttf字体复制一份到以下路径:

~/miniconda2/lib/python2.7/site-packages/matplotlib/mpl-data/fonts/ttf

并删除相关cache。在以下路径:

~/.cache/matplotlib

删除其中与字体有关的cache

7. 现在重新画个图试试。搞定。

以上所述是小编给大家介绍的解决Linux系统中python matplotlib画图的中文显示问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python中str is not callable问题详解及解决办法
Feb 10 Python
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
利用Python批量提取Win10锁屏壁纸实战教程
Mar 27 Python
Python 通配符删除文件的实例
Apr 24 Python
Python实现的连接mssql数据库操作示例
Aug 17 Python
Python爬虫设置代理IP(图文)
Dec 23 Python
python tornado修改log输出方式
Nov 18 Python
python多线程实现代码(模拟银行服务操作流程)
Jan 13 Python
基于keras输出中间层结果的2种实现方式
Jan 24 Python
keras获得某一层或者某层权重的输出实例
Jan 24 Python
python输出国际象棋棋盘的实例分享
Nov 26 Python
matplotlib 范围选区(SpanSelector)的使用
Feb 24 Python
Python之os操作方法(详解)
Jun 15 #Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
Jun 15 #Python
Python使用QRCode模块生成二维码实例详解
Jun 14 #Python
Python中扩展包的安装方法详解
Jun 14 #Python
Python模拟登陆实现代码
Jun 14 #Python
Python 自动刷博客浏览量实例代码
Jun 14 #Python
python简单线程和协程学习心得(分享)
Jun 14 #Python
You might like
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
强烈推荐:php.ini中文版(2)
2006/10/09 PHP
PHP5 面向对象程序设计
2008/02/13 PHP
PHP里的中文变量说明
2011/07/23 PHP
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
详解Python中的变量及其命名和打印
2016/03/11 Python
详解Python实现多进程异步事件驱动引擎
2017/08/25 Python
python字典的常用方法总结
2019/07/31 Python
pyecharts在数据可视化中的应用详解
2020/06/08 Python
基于python实现坦克大战游戏
2020/10/27 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
W Concept美国:精选全球独立设计师
2017/02/22 全球购物
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
政法大学毕业生自荐信范文
2014/01/01 职场文书
优秀学生干部个人事迹材料
2014/06/02 职场文书
北京申奥口号
2014/06/19 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
党员个人自我评价
2015/03/03 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书