Tanmoy
Tanmoy

Reputation: 251

How do you i use mandarin characters in matplotlib?

I have been trying to use matplotlib's text or annotate modules with mandarin Chinese characters. Somehow it ends up showing boxes. Any idea on this ?

Upvotes: 15

Views: 13404

Answers (3)

Charles J. Daniels
Charles J. Daniels

Reputation: 542

Here is a solution that works for me on Python 2.7 and Python 3.3, using both text and annotate methods with Chinese.

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 is hard coded to a font file, while ChineseFont2 grabs a font by family name (but for ChineseFont2 I had to try a couple to find one that would work). Both of those are particular to my system, in that they reference fonts I have, so you quite likely will need to change them to reference fonts/paths on your system.

The font loaded by default doesn't seem to support Chinese characters, so it was primarily a font choice issue.

Upvotes: 17

Chui Caoqiu
Chui Caoqiu

Reputation: 41

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

example

You only have to setup font family of your matplotlib and after that you can plot with Chinese labels. I've set up font to be Source Han Sans CN, as it's the only available font on my computer for Chinese.

You can check the available font by command fc-list :lang=zh.

Upvotes: 4

Adobe
Adobe

Reputation: 13487

Another solution is to use pgf backend which uses XeTeX. This allows one to use UTF-8 directly:

#!/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")

Result:

enter image description here

This solution requires matplotlib 1.2+ and probably XeTeX installed on Your system. The easiest way to get a working XeTeX is to go for any modern LaTeX distribution: TeXLive (available for all platforms) or MiKTeX (windows only).

Upvotes: 3

Related Questions