解决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 简介 在进行数据可视化时我们常常需要在可视化作品 ...
随机推荐
- linux 2.6 驱动笔记(一)
本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载. 环境搭建: 硬件:OK6410开发板 目标板操作系统:linux 2.6 交叉编译环境:windows 7 + v ...
- hadoop研究:mapreduce研究前的准备工作
继续研究hadoop,有童鞋问我,为啥不接着写hive的文章了,原因主要是时间不够,我对hive的研究基本结束,现在主要是hdfs和mapreduce,能写文章的时间也不多,只有周末才有时间写文章,所 ...
- easy-ui 小白进阶史(二):操作数据,easy-ui操作
easy-ui的操作及交互: Html: @using LangBo.Facade; @using LangBo.DataDefine; @using System.Threading.Tasks; ...
- osgi 2
基础的API BundleActivator BundleContext ServiceReference HelloServiceFactory ServiceTracker osgi 疑惑: I ...
- linux service
有些东西真是难得搞懂,一旦懂了就容易记住了. 说到service 就不能不说 daemon, 他们两者看起来不相关.其实是紧密相连的两个概念. —— 就像两个同心的正五边形和正六边形放在一起时候的样子 ...
- jmx : ClientCommunicatorAdmin Checker-run
今天遇到一个问题: 执行bat,关闭jmx的时候,由于程序关闭之后又去连接了一次,cmd窗口报错,类似: 2013-7-11 15:58:05 ClientCommunicatorAdmin rest ...
- NSString NSUrl 相互转化
//NSString 转为 NSURL NSString *webStr = @"www.baidu.com"; NSURL *webUrl = [NSURL URLWithStr ...
- MVVM架构~使用boxy和knockoutjs实现编辑功能
返回目录 这个功能我认为非常有用,尤其在后台管理系统中,它对用户来说,使用体验这块非常不错,下面是它的截图
- [Spring框架]Spring开发实例: XML+注解.
前言: 本文为自己学习Spring记录所用, 文章内容包括Spring的概述已经简单开发, 主要涉及IOC相关知识, 希望能够对新入门Spring的同学有帮助, 也希望大家一起讨论相关的知识. 一. ...
- SVG 基础
<!doctype html><html lang="en"><head> <meta charset="UTF-8" ...