Unicode 如何在matplotlib中使用中文字符?

Unicode 如何在matplotlib中使用中文字符?,unicode,utf-8,matplotlib,Unicode,Utf 8,Matplotlib,我一直在尝试使用matplotlib的文本或带有中文字符的注释模块。不知怎的,它最终展示了盒子。有什么想法吗 这里有一个在Python 2.7和Python 3.3上适用的解决方案,它同时使用text和annotate方法和中文 import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties fig = plt.figure() ax = fig.add_subplot(111) Chinese

我一直在尝试使用matplotlib的文本或带有中文字符的注释模块。不知怎的,它最终展示了盒子。有什么想法吗

这里有一个在Python 2.7和Python 3.3上适用的解决方案,它同时使用
text
annotate
方法和中文

import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
fig = plt.figure()
ax = fig.add_subplot(111)
ChineseFont1 = FontProperties(fname = 'C:\\Windows\\Fonts\\simsun.ttc')
ChineseFont2 = FontProperties('SimHei')
ax.text(3, 2, u'我中文是写得到的', fontproperties = ChineseFont1)
ax.text(5, 1, u'我中文是写得到的', fontproperties = ChineseFont2)
ax.annotate(u'我中文是写得到的', xy=(2, 1), xytext=(3, 4),
            arrowprops=dict(facecolor='black', shrink=0.05),
            fontproperties = ChineseFont1)
ax.axis([0, 10, 0, 10])
plt.show()
ChineseFont1
硬编码为字体文件,而
ChineseFont2
按姓氏获取字体(但对于
ChineseFont2
,我不得不试着找一个合适的)。这两个都是我的系统特有的,因为它们引用了我的字体,所以您很可能需要将它们更改为系统上的引用字体/路径


默认加载的字体似乎不支持中文字符,因此这主要是字体选择问题。

另一个解决方案是使用使用XeTeX的
pgf
后端。这允许直接使用UTF-8:

#!/usr/bin/env python2
# -*- coding:utf-8 -*-

import matplotlib
matplotlib.use("pgf")
pgf_with_custom_preamble = {
    # "font.size": 18,
    "pgf.rcfonts": False,
    "text.usetex": True,
    "pgf.preamble": [
        # math setup:
        r"\usepackage{unicode-math}",

        # fonts setup:
        r"\setmainfont{WenQuanYi Zen Hei}",
        r"\setsansfont{WenQuanYi Zen Hei}",
        r"\setmonofont{WenQuanYi Zen Hei Mono}",
    ],
}
matplotlib.rcParams.update(pgf_with_custom_preamble)
from matplotlib import pyplot as plt

x = range(5)
y = range(5)

fig = plt.figure()
ax = fig.add_subplot(111)

ax.plot(x, y, label=u"我")

ax.legend(u"中")
ax.set_xlabel(u"是")
ax.set_ylabel(u"写")
ax.set_title(u"得")
ax.text(3, 2, u'到')
ax.annotate(u'的', xy=(2, 1), xytext=(3, 1),
            arrowprops=dict(arrowstyle="<|-", connectionstyle="arc3", color='k'))

fig.savefig("pgf-mwe.png")
#/usr/bin/env蟒蛇2
#-*-编码:utf-8-*-
导入matplotlib
matplotlib.use(“pgf”)
带有自定义前导码的pgf前导码={
#“字体大小”:18,
“pgf.rcfonts”:False,
“text.usetex”:正确,
“序言部分”:[
#数学设置:
r“\usepackage{unicode math}”,
#字体设置:
r“\setmainfont{WenQuanYi Zen Hei}”,
r“\setsansfont{WenQuanYi Zen Hei}”,
r“\setmonofont{WenQuanYi Zen Hei Mono}”,
],
}
matplotlib.rcParams.update(带有自定义前导的pgf_)
从matplotlib导入pyplot作为plt
x=范围(5)
y=范围(5)
图=plt.图()
ax=图添加_子批次(111)
ax.绘图(x,y,标签=u“我")
ax.图例(u)中")
ax.set_xlabel(u)是")
ax.set_ylabel(u)写")
ax.设置标题(u)得")
ax.文本(3,2,u'到')
ax.注释(u'的', xy=(2,1),xytext=(3,1),
arrowprops=dict(arrowstyle=”

您只需设置matplotlib的字体系列,然后就可以使用中文标签进行打印。我已将字体设置为Source Han Sans CN,因为这是我计算机上唯一可用的中文字体


使用ChineseFont2,您可以通过命令检查可用字体。我收到此警告/usr/lib/pymodules/python2.7/matplotlib/font\u manager.py:1236:UserWarning:findfont:font-family['SimHei']未找到。返回到Bitstream Vera-Sans”.@Charles你也有同样的问题吗?不,我没有,但请注意,我只是在我的系统中选择了一些字体,在我的例子中是SimHei。你可能根本没有SimHei字体。正如前面提到的,我从我的字体文件夹中尝试了一些字体,但这些字体都不起作用,然后我发现SimHei,它起了作用。我主要只是想举个例子显示字体可以工作而不是硬编码。是的,这就是问题所在…我没有SimHei字体…最简单的方法是从Windows PC加载字体,然后移动到我的字体,并按您显示的方式链接它们…谢谢您:)回答得很好!在Mac上,您需要将fname指定为“/Library/fonts/Songti.ttc”对于宋体。如果传递给
ax.annotate
的参数是一个变量呢?我应该如何在变量前面添加
u
?因此我有matplotlib 1.3.1,安装了tex latex extra。更改了latex的操作系统路径。但是我现在得到的错误是!latex错误:找不到文件'type1cm.sty'在严格要求使用“pgf”时,我认为
usetex=True
应该足够了,但我在这台计算机上没有任何中文字体可供测试。@Tanmoy:错误意味着您没有真正使用XeTeX。这意味着您可能没有安装它。您使用的是哪个TeX发行版?哪个操作系统?简单的测试是您有
xelatex的地方二进制文件已安装。
matplotlib.rc('font', family='Source Han Sans CN')
ax = quarterly_gdp.plot(title='国内生产总值')