Я пытаюсь использовать текст 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")
Результат:
Это решение требует использования 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
.