2014-08-29 10 views

risposta

11

Ecco una soluzione che funziona per me su python27 e python33, utilizzando sia il testo che l'annotazione con il cinese.

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 è hardcoded a un file di font, mentre ChineseFont2 afferra un tipo di carattere in base al nome della famiglia (ma per ChineseFont2 ho dovuto provare un paio di trovare uno che avrebbe funzionato). Entrambi sono specifici per il mio sistema, in quanto fanno riferimento ai tipi di carattere che ho, quindi è molto probabile che dovrai cambiarli in riferimento ai tipi di carattere/percorsi sul tuo sistema.

Il carattere caricato per impostazione predefinita non sembra supportare i caratteri cinesi, quindi era principalmente un problema di scelta dei caratteri.

+0

Con l'utilizzo di ChineseFont2 viene visualizzato questo avviso "/usr/lib/pymodules/python2.7/matplotlib/font_manager.py:1236: UserWarning: findfont: famiglia di font ['SimHei'] non trovato. Ritorno a Bitstream Vera Sans ". @Charles ottieni gli stessi problemi? – Tanmoy

+0

No, non mi dispiace, ho appena scelto un font sul mio sistema, nel mio caso SimHei. Semplicemente potresti non avere un font SimHei. Come accennato, ho provato alcuni caratteri dalla mia cartella dei font che non funzionava anche se ho font con quei nomi, quindi ho trovato SimHei e ha funzionato. In primo luogo, volevo solo dare un esempio che dimostri che il font può funzionare senza hardcoded. –

+1

Sì, questo era il problema ... Non avevo il font SimHei ... Il più semplice era caricare i font da un PC Windows e poi spostarli sui miei font e collegarli come hai mostrato ... Grazie mille :) – Tanmoy

2

Un'altra soluzione è utilizzare il backend pgf che utilizza XeTeX. Questo permette di utilizzare UTF-8 direttamente:

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

Risultato:

enter image description here

Questa soluzione richiede matplotlib 1.2+ e probabilmente XeTEX installati sul vostro sistema. Il modo più semplice per ottenere un XeTeX funzionante è utilizzare qualsiasi distribuzione LaTeX moderna: TeXLive (disponibile per tutte le piattaforme) o MiKTeX (solo Windows).

+0

Quindi ho matplotlib 1.3.1, installato tex-latex-extra. Modificato os.path con quale lattice. Tuttavia l'errore che sto ottenendo ora è! Errore LaTeX: il file 'type1cm.sty 'non è stato trovato. – Tanmoy

+0

Non sono sicuro che l'uso di 'pgf' sia strettamente necessario, penso che 'usetex = True' _should_ sia sufficiente, ma non ho font cinesi su questo computer con cui testare. – tacaswell

+0

@Tanmoy: l'errore indica che non stavi davvero usando XeTeX. Il che significa che probabilmente non l'hai installato. Quale distro TeX stai usando? Quale sistema operativo? Il test facile è dove hai installato il file 'xelatex'. – Adobe

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

example

è sufficiente l'installazione di carattere familiare della vostra matplotlib e dopo che è possibile tracciare con le etichette cinesi. Ho impostato il font come Source Han Sans CN, poiché è l'unico font disponibile sul mio computer per il cinese.

È possibile controllare il carattere disponibile tramite il comando fc-list :lang=zh.

Problemi correlati