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的中文问题的更多相关文章

  1. 解决matplotlib绘图中文乱码

    # 指定默认字体 下面三条代码用来解决绘图中出现的乱码 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] matplotlib.rcParams[ ...

  2. 妙方之解决matplotlib的图例里的中文呈现小方形

    妙方之解决matplotlib的图例里的中文呈现小方形 分析思路: 每个中文都对应地呈现一个小方形, 不多也不少. 不能说是乱码. 应该是matplotlib的默认字库不支持中文造成的. 应对办法: ...

  3. Python 3下Matplotlib画图中文显示乱码的解决方法

    解决办法: 因为乱码是Matplotlib缺少中文配置所导致的,所以我们只需要在程序中说明使用中文字体即可. 先选一个字体.在计算机中找到字体,选择一种中文字体,比如我这里用的是楷体 右键可以查看其属 ...

  4. 彻底解决matplotlib中文乱码问题(转)

    彻底解决matplotlib中文乱码问题 1.环境查看a.系统版本查看[hadoop@p168 ~]$ cat /etc/redhat-releaseCentOS Linux release 7.2. ...

  5. python数据分析入门——matplotlib的中文显示问题&最小二乘法

    正在学习<用python做科学计算>,在练习最小二乘法时遇到matplotlib无法显示中文的问题.查资料,感觉动态的加上几条语句是最好,这里贴上全部的代码. # -*- coding: ...

  6. Ubuntu下matplotlib的中文显示

    真真地被matplotlib的中文显示折磨的不行了.简要记下解决方案,防止以后重新配又是蛋疼菊紧. 我的环境:系统是Ubuntu 13.04,Python是系统自带的,matplotlib是apt安装 ...

  7. matplotlib显示中文异常处理

    matplotlib显示中文 [做个记录,方便以后使用] [一般导入方式] import matplotlib.pyplot as plt [效果图] [方式一]FontProperties impo ...

  8. 修改配置文件matplotlibrc,让Matplotlib显示中文

    matplotlib默认不支持中文显示,网上的解决办法有好多种,但是大多数都是通过在代码中指定字体,虽然也能实现,但是多出那么几行代码让人觉得很恶心. 本文介绍一种通过修改配置文件matplotlib ...

  9. (数据科学学习手札87)利用adjustText解决matplotlib文字标签遮挡问题

    本文示例代码.数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在进行数据可视化时我们常常需要在可视化作品 ...

随机推荐

  1. [Asp.net 开发系列之SignalR篇]专题一:Asp.net SignalR快速入门

    一.前言 之前半年时间感觉自己有点浮躁,导致停顿了半年多的时间没有更新博客,今天重新开始记录博文,希望自己可以找回初心,继续沉淀.由于最近做的项目中用到SignalR技术,所以打算总结下Asp.net ...

  2. C#中使用OpenSSL的公钥加密/私钥解密

    在C#中进行公钥加密/私钥解密,需要用RSACryptoServiceProvider,但是它不支持由OpenSSL生成的公钥/私钥字符串. 比如这样的公钥/私钥对( 公私钥生成方法见 http:// ...

  3. MySQL7:视图

    什么是视图 数据库中的视图是一个虚拟表.视图是从一个或者多个表中导出的表,视图的行为与表非常相似,在视图中用户可以使用SELECT语句查询数据,以及使用INSERT.UPDATE和DELETE修改记录 ...

  4. Entity Framework返回IEnumerable还是IQueryable?

    在使用EF的过程中,我们常常使用repository模式,本文就在repository层的返回值是IEnumerable类型还是IQueryable进行探讨. 阅读目录: 一.什么是Repositor ...

  5. 【摘选引用】在安全的SQL 密码也不过如此

    SQL密码再安全也禁不住破解!!! http://www.sqlservercentral.com/articles/password+cracking/96540/ 备注:[摘选引用]是本人日常收集 ...

  6. [nRF51822] 5、 霸屏了——详解nRF51 SDK中的GPIOTE(从GPIO电平变化到产生中断事件的流程详解)

    :由于在大多数情况下GPIO的状态变化都会触发应用程序执行一些动作.为了方便nRF51官方把该流程封装成了GPIOTE,全称:The GPIO Tasks and Events (GPIOTE) . ...

  7. 【IOS】Target membership

    Target membership是指XCode中,一个文件属于哪一个工程,在XCode左侧的工程面板中选中一个文件,在XCode右侧的属性面板中会显示其Target Membership,如下图. ...

  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(十):多客服接口说明

    微信官方的多客服接口原理是通过用户发送的信息,开发者服务器返回一条指定类型的响应信息,使用户的对话状态切换到官方的多客服状态(持续一段时间),这段时间内用户发送的所有信息都不会到达开发者的服务器,而是 ...

  9. java数学函数库 API(转)

    原文地址:http://www.24xuexi.com/w/2011-11-08/98206.html 首先给大家看看Math类所提供的主要方法,下面的列表给出了Math类的主要方法,如果要理解Mat ...

  10. IOS 基础-define、const、extern、全局变量

    这里介绍一下define.const.extern的用法.优劣以及要注意的地方. 1.define 宏define是定义一个变量,没有类型信息.define定义的常量在内存中有若干个拷贝. defin ...