缺省情况下,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,例如
f
ont.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",其他的字体信息也可以通过该方法查得。
转载本文请联系原作者获取授权,同时请注明本文来自夏靖科学网博客。 链接地址: https://blog.sciencenet.cn/blog-43412-343002.html
上一篇:
编译安装maxima和wxMaxima