这里有新鲜出炉的 Python3 Cookbook 中文版,程序狗速度看过来!
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
下面小编就为大家带来一篇基于 Linux 系统中 python matplotlib 画图的中文显示问题的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
最近想学习一些 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 画图的中文显示问题的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持 PHPERZ。
来源: http://www.phperz.com/article/17/0627/336807.html