基于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 相关文章推荐
pycharm 使用心得(五)断点调试
Jun 06 Python
Python中文竖排显示的方法
Jul 28 Python
python遍历 truple list dictionary的几种方法总结
Sep 11 Python
Django接受前端数据的几种方法总结
Nov 04 Python
Python编写登陆接口的方法
Jul 10 Python
python在每个字符后添加空格的实例
May 07 Python
python manage.py runserver流程解析
Nov 08 Python
PyQt5 如何让界面和逻辑分离的方法
Mar 24 Python
Keras设置以及获取权重的实现
Jun 19 Python
python 实现有道翻译功能
Feb 26 Python
解决hive中导入text文件遇到的坑
Apr 07 Python
python munch库的使用解析
May 25 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
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
js获取location.href的参数实例代码
2013/08/02 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
2018/08/24 Javascript
小程序自定义日历效果
2018/12/29 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
node静态服务器实现静态读取文件或文件夹
2019/12/03 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
Js跳出两级循环方法代码实例
2020/09/22 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
基于Django模板中的数字自增(详解)
2017/09/05 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
python requests.post带head和body的实例
2019/01/02 Python
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
Python数据可视化:箱线图多种库画法
2019/11/06 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
30岁生日感言
2014/01/25 职场文书
境外导游求职信
2014/02/27 职场文书
小学生手册家长评语
2014/04/16 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
廉政承诺书
2015/01/19 职场文书
统计工作个人总结
2015/03/03 职场文书
外贸英文求职信范文
2015/03/19 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
MySQL学习之基础操作总结
2022/03/19 MySQL
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server