解决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中的fabs()方法的使用
May 14 Python
win10环境下python3.5安装步骤图文教程
Feb 03 Python
Django 前后台的数据传递的方法
Aug 08 Python
Python中turtle作图示例
Nov 15 Python
Python实现的KMeans聚类算法实例分析
Dec 29 Python
Python玩转加密的技巧【推荐】
May 13 Python
python经典趣味24点游戏程序设计
Jul 26 Python
Python 3 使用Pillow生成漂亮的分形树图片
Dec 24 Python
关于Tensorflow使用CPU报错的解决方式
Feb 05 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
Oct 30 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 Python
python 进阶学习之python装饰器小结
Sep 04 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
初学CAKEPHP 基础教程
2009/11/02 PHP
那些年一起学习的PHP(二)
2012/03/21 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
php实现简单洗牌算法
2013/06/18 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
PHP计算百度地图两个GPS坐标之间距离的方法
2015/01/09 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
json 定义
2008/06/10 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
2016/05/09 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
2017/12/01 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
JS实现百度搜索框关键字推荐
2020/02/17 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
Vue3.0的优化总结
2020/10/16 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
跟老齐学Python之做一个小游戏
2014/09/28 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
Python 正则表达式爬虫使用案例解析
2019/09/23 Python
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
大学生新闻专业个人自我评价
2013/11/12 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
产品发布会策划方案
2014/05/12 职场文书
环保建议书300字
2014/05/14 职场文书
售后客服个人自我评价
2014/09/14 职场文书
销售经理岗位职责
2015/01/31 职场文书
竞聘书的秘诀
2019/04/02 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL