解决matplotlib的中文问题
matplotlib的强大无需我去言说,但它对使用中文的我来说却有一点瑕疵,那就是——在默认状态下,matplotlb无法在图表中使用中文。
在网上查找了一些资料,发现matplotlib本身是支持Unicode的,只不过默认情况下matplotlib使用自带的字体,而自带的字体中没有中文字体。这样要它支持中文的思路就有了——给maplotlib添加中文字体。
思路1:用某种中文字体替换掉matplotlib的默认字体
这属于一种破坏性质的方法,不推荐。这样的方法,同样的代码无法在不同的环境中使用,每次更换环境你必须得重新"Hack"一次。我也没有使用这种方法。
思路2:使用matplotlib的字体管理器指定字体文件
matplotlib中有一个字体管理器——matplotlib.Font_manager,通过该管理器的方法——matplotlib.Font_manager.FontProperties(fname)可以指定一个ttf字体文件作为图表使用的字体。这样,只要我们传入Unicode字符串,我们就可以想用什么字体就用什么字体了。示例代码如下:
# coding:utf-8
from pylab import *
import random
myfont = matplotlib.font_manager.FontProperties(fname="Light.ttc")
mpl.rcParams['axes.unicode_minus'] = False
t = arange(-5*pi, 5*pi, 0.001)
y = sin(t)/t
my_post = plt.plot(t, y)
plt.title(u'matplotlib中文显示测试——Tacey Wong',fontproperties=myfont)
plt.xlabel(u'这里是X坐标',fontproperties=myfont)
plt.ylabel(u'这里是Y坐标',fontproperties=myfont)
plt.show()
代码中第六行通过fname指定字体文件,第七行的作用是为了消除更换为unicode字体之后0、负数之类的显示异常。之后所有使用中文字体的地方只字符串都以u""的形式出现,并指定fontproperties属性为我们的指定的myfont就行了。该示例代码的图表生成结果如下:

这种办法的好处是想用什么字体,指出这个字体文件的路径名字就可以了。只要是ttf兼容的,都可以使用。
思路3:使用系统中安装的字体
前面说了,matplotlib一般使用的是非系统字体,我们在这里可以指定它使用我们系统中已经安装的某一个字体,这里我们需要的不是像“宋体、仿宋”这样的名称,也不是“xxx.ttf”这样的字体文件名称,二十需要我们的系统可以识别的字体名称。
Linux中可以使用命令——fc-list :lang=zh来查看我们系统安装的中文字体系统识别的名称,Droid Sans Fallback即为Ubuntu系统自带的一款中文字体,在这里我们使用这个字体作为matplotlib使用的系统字体。示例代码如下:
# coding:utf-8
def conf_zh(font_name):
from pylab import mpl
mpl.rcParams['font.sans-serif'] = [font_name]
mpl.rcParams['axes.unicode_minus'] = False
def run():
from pylab import *
import random
t = arange(-5*pi, 5*pi, 0.001)
y = sin(t)/t
my_post = plt.plot(t, y)
plt.title(u'matplotlib中文显示测试——Tacey Wong')
plt.xlabel(u'这里是X坐标')
plt.ylabel(u'这里是Y坐标')
plt.show()
if __name__ == "__main__":
conf_zh("Droid Sans Fallback")
run()
这样的方法有一个好处就是可以将指定字体的部分单独提取作为一个函数,每次绘图之前调用一次就行了,不用每次都指定fontproperties属性。
该示例的图表生成结果如下:

如果不是系统自带的字体安装之后是否可以用这种方法呢?答案是肯定的,需要的只是把传入的名字改成自己安装的字体系统所识别的名字,也就是将conf_zh("Droid Sans Fallback")改为conf_zh("自己安装的字体系统所识别的名字")。下面就是使用一个自安装的字体的生成结果(conf_zh("Li Xuke Comic Font")):

这种方法的好处是不需要额外的配置fontproperties属性,配置一次,后续代码和用英文字符串没什么两样(如果不需要配置字体的其他属性的话,这种方法很方便)
总结
后两种方法各有有利之处。更多的字体配置可以可以修改matplotlib的配置文件。用下面的代码查看该配置文件的位置在哪里:
import matplotlib
print matplotlib.matplotlib_fname()
该命令会返回配置文件地址,如,在我的机子上返回了下面的结果
/etc/matplotlibrc
matplotlibrc即为matplotlib的配置文件,里面不只有字体配置,感兴趣的话可以看一下。下面是部分配置项截图:

有兴趣的可以查看一下里面的内容。
解决matplotlib的中文问题的更多相关文章
- 解决matplotlib绘图中文乱码
# 指定默认字体 下面三条代码用来解决绘图中出现的乱码 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] matplotlib.rcParams[ ...
- 妙方之解决matplotlib的图例里的中文呈现小方形
妙方之解决matplotlib的图例里的中文呈现小方形 分析思路: 每个中文都对应地呈现一个小方形, 不多也不少. 不能说是乱码. 应该是matplotlib的默认字库不支持中文造成的. 应对办法: ...
- Python 3下Matplotlib画图中文显示乱码的解决方法
解决办法: 因为乱码是Matplotlib缺少中文配置所导致的,所以我们只需要在程序中说明使用中文字体即可. 先选一个字体.在计算机中找到字体,选择一种中文字体,比如我这里用的是楷体 右键可以查看其属 ...
- 彻底解决matplotlib中文乱码问题(转)
彻底解决matplotlib中文乱码问题 1.环境查看a.系统版本查看[hadoop@p168 ~]$ cat /etc/redhat-releaseCentOS Linux release 7.2. ...
- python数据分析入门——matplotlib的中文显示问题&最小二乘法
正在学习<用python做科学计算>,在练习最小二乘法时遇到matplotlib无法显示中文的问题.查资料,感觉动态的加上几条语句是最好,这里贴上全部的代码. # -*- coding: ...
- Ubuntu下matplotlib的中文显示
真真地被matplotlib的中文显示折磨的不行了.简要记下解决方案,防止以后重新配又是蛋疼菊紧. 我的环境:系统是Ubuntu 13.04,Python是系统自带的,matplotlib是apt安装 ...
- matplotlib显示中文异常处理
matplotlib显示中文 [做个记录,方便以后使用] [一般导入方式] import matplotlib.pyplot as plt [效果图] [方式一]FontProperties impo ...
- 修改配置文件matplotlibrc,让Matplotlib显示中文
matplotlib默认不支持中文显示,网上的解决办法有好多种,但是大多数都是通过在代码中指定字体,虽然也能实现,但是多出那么几行代码让人觉得很恶心. 本文介绍一种通过修改配置文件matplotlib ...
- (数据科学学习手札87)利用adjustText解决matplotlib文字标签遮挡问题
本文示例代码.数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在进行数据可视化时我们常常需要在可视化作品 ...
随机推荐
- leveldb源码学习系列
楼主从2014年7月份开始学习<>,由于书籍比较抽象,为了加深思考,同时开始了Google leveldb的源码学习,主要是想学习leveldb的设计思想和Google的C++编程规范.目 ...
- java生成压缩文件
在工作过程中,需要将一个文件夹生成压缩文件,然后提供给用户下载.所以自己写了一个压缩文件的工具类.该工具类支持单个文件和文件夹压缩.放代码: import java.io.BufferedOutput ...
- C# Azure 存储-分布式缓存Redis的新建&配置&查看
1. 介绍 Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统.由于 Redis 的键包括 string,hash,l ...
- 大叔也说Xamarin~Android篇~环境部署与破解
回到目录 现在移动开发很HOT,以至于很多人都转向了它,大叔也不例外,这次有机制接触一下xamarin这个东西,其实之前也用于xamarin,只是用来写网页程序,没有接触到移动开发,对于xamarin ...
- salesforce 零基础开发入门学习(十三)salesforce中JSON的使用
JSON作为一种目前流行的轻量级数据交换格式,salesforce也对其有良好的类对其进行封装处理.salesforce中前后台交互时,使用JSON可以将apex的Object对象进行序列化和反序列化 ...
- 用scrollTop制作一个自动滚动公告栏
我们在浏览网页时,经常会看到会一些滚动的栏目,比如向上滚动的公告.新闻等.其实他们的制作都不难,只要学了基础的html.css.javascript就可以做出来,用JavaScript的scrollT ...
- DOM_01之树及遍历
1.DOM:ECMAScript+DOM+BOM,Document Object Model,核心DOM+HTML DOM+XML DOM: 2.辨析:①HTML:专门编写网页内容的语言:②XHTML ...
- html_02之表单、其它
1.表单属性action:处理表单数据服务器端处理程序地址,默认提交本页: 2.表单属性method:①get:明文,数据显示地址栏,长度<2KB,向服务器请求数据时使用:②post:密文,提交 ...
- 24.编写一个Car类,具有String类型的属性品牌,具有功能drive; 定义其子类Aodi和Benchi,具有属性:价格、型号;具有功能:变速; 定义主类E,在其main方法中分别创建Aodi和Benchi的对象并测试对象的特 性。
package zhongqiuzuoye; public class Car { String brand; public void drive() {} } package zhongqiuzuo ...
- gulp学习笔记4
gulp系列学习笔记: 1.gulp学习笔记1 2.gulp学习笔记2 3.gulp学习笔记3 4.gulp学习笔记4 之前的任务都是单个的,比较简单.接下去我们开始引用多个插件,一次性把任务搞定,省 ...