基于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的,否则无效。

解压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搭建简易服务器分析与实现
Dec 15 Python
Python中的lstrip()方法使用简介
May 19 Python
python中的全局变量用法分析
Jun 09 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 Python
django rest framework 数据的查找、过滤、排序的示例
Jun 25 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 Python
django 捕获异常和日志系统过程详解
Jul 18 Python
对YOLOv3模型调用时候的python接口详解
Aug 26 Python
以SQLite和PySqlite为例来学习Python DB API
Feb 05 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
Feb 25 Python
python多线程爬取西刺代理的示例代码
Jan 30 Python
Python使用QRCode模块生成二维码实例详解
Jun 14 #Python
Python中扩展包的安装方法详解
Jun 14 #Python
Python模拟登陆实现代码
Jun 14 #Python
Python 自动刷博客浏览量实例代码
Jun 14 #Python
python简单线程和协程学习心得(分享)
Jun 14 #Python
Python字符串处理实现单词反转
Jun 14 #Python
python3实现UDP协议的服务器和客户端
Jun 14 #Python
You might like
谈谈PHP语法(2)
2006/10/09 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
laravel5.1 ajax post 传值_token示例
2019/10/24 PHP
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
详谈js模块化规范
2017/07/07 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
python使用代理ip访问网站的实例
2018/05/07 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
马耳他航空公司官方网站:Air Malta
2019/05/15 全球购物
植村秀加拿大官网:Shu Uemura加拿大
2019/09/03 全球购物
大学生自我鉴定评语
2014/01/27 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
主办会计岗位职责
2014/03/13 职场文书
主持人演讲稿
2014/05/13 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
获奖感言一句话
2015/07/31 职场文书
导游词之上饶龟峰
2019/10/25 职场文书