你如何在matplotlib中使用普通话字符?

时间:2014-08-29 02:53:41

标签: unicode utf-8 matplotlib

我一直在尝试使用matplotlib的文本或用普通话中文注释模块。不知何故,它最终显示框。有什么想法吗?

3 个答案:

答案 0 :(得分:16)

这是一个适用于Python 2.7和Python 3.3的解决方案,使用textannotate方法与中文。

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我必须尝试一对才能找到一个可行的字体)。这两个都是我的系统特有的,因为它们引用了我的字体,所以你很可能需要将它们更改为引用系统中的字体/路径。

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

答案 1 :(得分:3)

另一种解决方案是使用使用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")

结果:

enter image description here

此解决方案需要在您的系统上安装matplotlib 1.2+并且可能需要安装XeTeX。获得有效XeTeX的最简单方法是使用任何现代LaTeX发行版:TeXLive(适用于所有平台)或MiKTeX(仅限Windows)。

答案 2 :(得分:1)

matplotlib.rc('font', family='Source Han Sans CN')
ax = quarterly_gdp.plot(title='国内生产总值')

example

您只需设置matplotlib的字体系列,然后就可以使用中文标签进行绘图。我已将字体设置为Source Han Sans CN,因为它是我电脑上唯一可用的中文字体。

您可以通过命令fc-list :lang=zh检查可用字体。