Как я использую символы мандарина в matplotlib?

Я пытаюсь использовать текст matplotlib или аннотировать модули с мандаринскими иероглифами. Каким-то образом он заканчивает показывать коробки. Есть идеи по этому поводу?

Ответ 1

Вот решение, которое работает для меня на python27 и python33, используя как текст, так и аннотацию с китайским.

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 мне пришлось попробовать пару, чтобы найти тот, который будет работать). Обе эти особенности относятся к моей системе, поскольку они ссылаются на шрифты, которые у меня есть, поэтому вам, скорее всего, придется изменить их на ссылочные шрифты/пути в вашей системе.

Шрифт, загруженный по умолчанию, похоже, не поддерживает китайских иероглифов, поэтому в первую очередь это проблема с выбором шрифта.

Ответ 2

Другим решением является использование бэкэнд pgf, который использует XeTeX. Это позволяет напрямую использовать 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).

Ответ 3

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

пример

Вам нужно только установить семейство шрифтов вашего matplotlib, после чего вы сможете рисовать с китайскими лейблами. Я установил шрифт как источник Han Sans CN, так как он единственный доступный шрифт на моем компьютере для китайцев.

Вы можете проверить доступный шрифт командой fc-list :lang=zh.