Python和科学计算认证群组  - 讨论区

标题:matplotlib 输出中文为小方块的问题

2011年02月13日 星期日 20:02

安装python 2.6.5 和matplotlib 以及 numpy 后,在“中文注释图.py” 文件中,写如下代码:

# -*- coding: utf-8 -*-
"""
在不同的坐标系中添加文字。
"""
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,10)
y = x**2
fig = plt.figure(figsize=(8,4))
ax = plt.subplot(111)
plt.plot(x,y)
for i, (_x, _y) in enumerate(zip(x, y)):
  plt.text(_x, _y, str(i), color="red", fontsize=i+10) #{1}
plt.text(0.5, 0.8, u"子图坐标系中的文字", color="blue", ha="center",
         transform=ax.transAxes) #{2}
plt.figtext(0.1, 0.92, u"图表坐标系中的文字", color="green") #{3}
plt.show()

输出的图中,中文部分为口字。请高手解答

 “这里暂时不能上传图片,点击“上传图片”后,出现死屏现象。请帮主解决”

2011年02月13日 星期日 20:40

matplotlib显示中文日文韩文等字体

matplotlib 1.0.0版
  • 设置缺省字体

修改matplotlib安装目录的matplotlibrc文件
C:\Python26\Lib\site-packages\matplotlib\mpl-data\matplotlibrc (Windows)
/usr/share/matplotlib/mpl-data/matplotlibrc (Linux):

font.family         : sans-serif         #打开该选项
font.sans-serif     : Microsoft YaHei , Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif     #添加“Microsoft YaHei”,该行指示缺省字体和字体的优先使用顺序

注:在font.sans-serif中添加的字体名称必须正确,不同OS能够使用的中文字体不同。可以在
$HOME/.matplotlib/fontList.cache文件中
($HOME在Vista/Win7下为C:\Users\用户名\ )
,通过查找文件名找到对应的名称,如上面的"Microsoft YaHei"的字体文件名称为“msyh.ttf",搜索一下就找到下测试了。部分Win下可用的字体名称见示例代码.

如果还不行,试着将字体文件copy到
C:\Python26\Lib\site-packages\matplotlib\mpl-data\fonts\ttf(Windows)
/usr/share/matplotlib/mpl-data/fonts/ttf(Linux)
目录下,再试。
  • 在代码中指定字体

示例代码如下(Win7下测试通过):

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(8,4))
plt.xlabel(u"横坐标xlabelにほんご",fontproperties='STXihei')
plt.ylabel(u"ylabel조선어",fontproperties='Malgun Gothic')#韩文
a = plt.text(0.05, 0.05, u"Default Font缺省字体조선어にほんごภาษาไทย/")#多种语言
plt.text(0.05, 0.95, u "STSong华文宋体" , fontproperties='STSong ')
plt.text(0.05, 0.85, u "STKaiti华文楷体", fontproperties='STKaiti')
plt.text(0.05, 0.75, u"FangSong仿宋", fontproperties='FangSong')
plt.text(0.05, 0.65, u"YouYuan幼圆", fontproperties='YouYuan')
plt.text(0.05, 0.55, u"SimHei黑体", fontproperties='SimHei')
plt.text(0.05, 0.45, u"Microsoft YaHei微软雅黑", fontproperties='Microsoft YaHei')
plt.text(0.05, 0.35, u"STCaiyun华文彩云", fontproperties='STCaiyun')
#plt.text(0.05, 0.25, u"Webdings文鼎", fontproperties='Webdings') #not work
plt.text(0.05, 0.15, u"LilyUPCภาษาไทย", fontproperties='LilyUPC')#泰语
plt.show()

注意: 字符串,都用u"..."的形式.(文件编码utf-8 加上" # coding = utf-8  "一行.)
通过实例可用看出输出不同语言时要选择正确的字体。如果字体不支持多种语言,则目前(matplotlib1.0.0 and  Win7)不能像Notebook等Windows应用能正确显示,具体原因不是很清楚。




在Linux下使用Win的字体
使用Linux的root账户,将
C:\windows\fonts\目录的ttf字体拷贝到
/usr/share/fonts/truetype目录,并将字体改成所有用户可读的权限

参考资料:

http://www.sciencenet.cn/m/user_content.aspx?id=343002

1.linux和windows可不一样,windows的字体统一安装在x:\windows\fonts\目录,而Ubuntu可以安装在好几个目录,如果只是个人用,可以安装在~/.fonts/目录,系统级别的话,要用系统帐户安装到/usr/share/fonts/目录下的相应目录,一般是/usr/share/fonts/truetype目录。
网上一般提供的是用命令行的方法,比较麻烦。我的方法是允许管理员帐户登陆,然后复制字体到/usr/share/fonts/truetype目录。重启一下就行。
2.“显示出来的内容都是空的”有两种可能:a、字体本身有问题,某些书法字体是的;b、字体权限没搞好。还是那句话,linux对权限的要求很严格,如果你用不适当的权限安装了字体,就会导致看不见字体或者方框。一定要改成所有用户可读的权限。
3.关于你说的最后一个问题,那是字体优先级的问题,也就是在某个字体无法显示当前字符时候调用某个字体。这个顺序是由/etc/fonts/conf.d/69-language-selector-zh-cn.conf文件定义的,可以
调整相关字体顺序

2011年03月25日 星期五 22:19

学习了

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号