summersubdue的个人博客分享 http://blog.sciencenet.cn/u/summersubdue

博文

如何在matplotlib里显示中文

已有 33678 次阅读 2010-7-11 11:56 |个人分类:日记|系统分类:科普集锦|关键词:matplotlib,python,font,linux,字体| Linux, Python, 字体, font, matplotlib

    缺省情况下,matplotlib是无法显示中文的,主要原因是没有指定中文字体(文件)。通过修改matplotlib的unicode_demo(http://matplotlib.sourceforge.net/examples/pylab_examples/unicode_demo.html),将unicode字符串用中文填充,显示的是方块。该问题解决的方法有两种,一个是在python代码中指定字体,另一个是在配置文件matplotlibrc里指定字体。或者两种方法同时使用,在代码中没有显式的指定参数值时用缺省值,包括配置文件matplotlibrc里指定的值,代码里有显式指定的参数值时用代码里指定的值。
方法一:代码中指定中文字体
   该方法主要使用matplotlib.font_manager模块

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import matplotlib
zhfont1 = matplotlib.font_manager.FontProperties(fname='/usr/share/fonts/cjkunifonts-ukai/ukai.ttc')
plt.xlabel(u"横坐标xlabel",fontproperties=zhfont1)


这里使用truetype楷体中文字体文件ukai.ttc。关于系统中安装了哪些中文字体见下面“如何确定系统中的中文字体”。

方法二:rc文件中指定缺省字体
   该方法设置rc文件中的参数,该rc文件为matplotlibrc,查找到该文件后,把该文件复制到$HOME/.matplotlib/文件夹下,在文件中找到“#font.family         : sans-serif“,虽然有注释,但该语句说明font.family的缺省值是sans-serif,这是英文的一大类无衬线字体,线条粗细基本一样,就像中文的黑体,如果font.family设为sans-serif,那就要在下面设置sans-serif对应的具体字体为中文,这需要设置font.sans-serif,缺省的值为
#font.sans-serif     : Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
可见这些字体都是粗细一样的。去掉注释符,添加中文字体“AR PL UMing CN”得到

font.sans-serif     : AR PL UMing CN,Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
axes.unicode_minus  : False

这里还设值了axes.unicode_minus为False,不用unicode的负号而是使用连字符(hypen,hyphen),否则坐标轴的负号将显示为方块,这样plt.xlabel(u"横坐标xlabel")等语句就可正确显示中文了


    上面我们把宋体“AR PL UMing CN”这个有衬线的宋体字归到了无衬线(sans-serif)的字体族(family)里,严格的说是不恰当的,但linux里的中文字体没有几个,所以只有先解决显示的问题。要使“AR PL UMing CN”归到有衬线(serif)的字体族(family)里并能正确显示只需多设置一个参数font.family为serif,然后设置font.serif,例如

font.family         : serif
font.serif          : AR PL UMing CN,Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif


绘图示例

该示例图看上去有点杂乱,其实是利用了matplotlib能在3D坐标轴中添加文字的方法,三段文字起始于三维空间的某一点,然后分别朝着x,y,z三个轴的方向书写,其中“系统:fedora 10.....”这段文字朝z方向,其他两段文字类似。坐标的标签与刻度有点重叠,主要是因为刻意缩小图像尺寸而没有缩小字体所致。


如何确定系统中的中文字体

不管是以哪种方式,首先都要知道系统里有哪些中文字体文件,在shell里运行fc-list程序

[summer@SummerHostName ~]$ fc-list :lang=zh
WenQuanYi Zen Hei Mono,文泉驛等寬正黑,文泉驿等宽正黑:style=Medium,中等
AR PL UMing TW:style=Light
AR PL UMing HK:style=Light
AR PL UMing CN:style=Light
AR PL UKai TW MBE:style=Book
WenQuanYi Zen Hei,文泉驛正黑,文泉驿正黑:style=Medium,中等
AR PL UKai CN:style=Book
AR PL UKai HK:style=Book
AR PL UKai TW:style=Book
WenQuanYi Bitmap Song:style=Regular
AR PL UMing TW MBE:style=Light

这里用fc-list找出语言为zh的字体文件,可见系统里中文字体少的可怜。知道了这些字体,还需要进一步了解这些字体对应的文件,可以运行fc-match程序得到,

[summer@SummerHostName ~]$ fc-match -v "AR PL UKai CN"
Pattern has 32 elts (size 48)
    family: "AR PL UKai CN"(s)
    familylang: "en"(s)
    style: "Book"(s)
    stylelang: "en"(s)
    fullname: "AR PL UKai CN"(s)
    fullnamelang: "en"(s)
    slant: 0(i)(s)
    weight: 80(i)(s)
    width: 100(i)(s)
    size: 12(f)(s)
    pixelsize: 12.5(f)(s)
    spacing: 90(i)(w)
    foundry: "unknown"(s)
    hintstyle: 3(i)(s)
    hinting: FcTrue(s)
    verticallayout: FcFalse(s)
    autohint: FcFalse(s)
    globaladvance: FcFalse(w)
    file: "/usr/share/fonts/cjkunifonts-ukai/ukai.ttc"(s)
    index: 0(i)(s)
    outline: FcTrue(s)
    scalable: FcTrue(s)
    dpi: 75(f)(s)
    scale: 1(f)(s)
    minspace: FcFalse(w)
    charset: 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff
    0001: ffffffff ffffffff ffffffff ffffffff 00800000 00018003 fffffff0 ff3f3fcf
    0002: cfffffff 008fffc0 08130010 00200502 00000608 30000000 2f002fc0 00000c00
                   
    02f8: 00000000 08000020 00000001 01000000 00100000 00000040 00002000 00000000
    02f9: 00000000 00000000 00000000 00000000 00100000 10040000 00100000 00000000
(s)
    lang: aa|af|ast|ay|bg|bi|bin|br|bs|ca|ch|co|cs|cy|da|de|el|en|eo|es|et|eu|fi|fj|fo|fr|fur|fy|ga|gd|gl|gn|gv|ho|hr|hu|ia|ibo|id|ie|io|is|it|ki|kl|kum|kw|la|lb|lt|lv|mg|mh|mi|mo|mt|nb|nds|nl|nn|no|nr|nso|ny|oc|om|os|pl|pt|rm|ro|ru|se|sel|shs|sk|sl|sma|smj|smn|so|sq|ss|st|sv|sw|tn|tr|ts|ven|vi|vo|vot|wa|wen|wo|xh|yap|yo|zh-cn|zh-sg|zh-tw|zu(s)
    fontversion: 13107(i)(s)
    capability: "otlayout:DFLT otlayout:bopo otlayout:cyrl otlayout:grek otlayout:hani otlayout:kana otlayout:latn"(s)
    fontformat: "TrueType"(s)
    embeddedbitmap: FcTrue(s)
    decorative: FcFalse(s)


这里只查阅了字体“AR PL UKai CN”,可以看到其对应文件"/usr/share/fonts/cjkunifonts-ukai/ukai.ttc",其他的字体信息也可以通过该方法查得。

http://blog.sciencenet.cn/blog-43412-343002.html

上一篇:编译安装maxima和wxMaxima

1 ilovemoney

发表评论 评论 (1 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备14006957 )

GMT+8, 2019-8-25 17:37

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部