基于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中字符串类型json操作的注意事项
May 02 Python
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
解决pandas中读取中文名称的csv文件报错的问题
Jul 04 Python
python使用正则表达式来获取文件名的前缀方法
Oct 21 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
Dec 07 Python
TFRecord文件查看包含的所有Features代码
Feb 17 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
Python读取xlsx数据生成图标代码实例
Aug 12 Python
Python 解析库json及jsonpath pickle的实现
Aug 17 Python
python中remove函数的踩坑记录
Jan 04 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 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
用户的详细注册和判断
2006/10/09 PHP
CodeIgniter基本配置详细介绍
2013/11/12 PHP
php中get_object_vars()方法用法实例
2015/02/08 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
2017/05/09 Javascript
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
Python正则简单实例分析
2017/03/21 Python
如何在python中使用selenium的示例
2017/12/26 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
Python基于smtplib模块发送邮件代码实例
2020/05/29 Python
财务管理专业自荐信范文
2013/12/24 职场文书
不假外出检讨书
2014/01/27 职场文书
学习党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
校长师德表现自我评价
2015/03/05 职场文书
高中军训感想
2015/08/07 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏
Hive日期格式转换方法总结
2022/06/25 数据库
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers