2010-03-09 15 views
19

¿Hay alguna manera de hacer que Matplotlib represente caracteres acentuados (é, ã, â, etc.)?Caracteres acentuados en Matplotlib

Por ejemplo, estoy tratando de usar caracteres acentuados en set_yticklabels() y Matplotlib representa cuadrados en su lugar, y cuando uso unicode() representa los caracteres incorrectos.

¿Hay alguna manera de que esto funcione?

Resulta que se puede usar u "EA", pero primero hay que establecer la codificación del archivo:

# Using the magic encoding 
# -*- coding: utf-8 -*- 

Después de eso Matplotlib representa correctamente

u"é" 

También aprendí que pueda use

import matplotlib.font_manager as fm 
fp1=fm.FontProperties(fname="/path/to/somefont.ttf") 
ax.title("é",fontproperties=fp1) 

en caso de que necesite representar caracteres que Matplotlib no tiene.

+0

Buena pregunta. Unicode tiene un rico repertorio de símbolos matemáticos, y espero que Unicode funcione cuando se use. –

+0

¿Hay alguna manera de imitar este comportamiento utilizando el modo interactivo? (Por ejemplo, estoy usando IPython.) El truco con el uso del administrador de fuentes no funcionó para mí. – Halka

+0

No importa, este es un problema con [IPython sí mismo] (https://github.com/ipython/ipython/issues/labels/unicode#issue/25). – Halka

Respuesta

14

Prefijo de las cuerdas con u Python para decirle que son cadenas Unicode:

ax.set_yticklabels([u'é', u'ã', u'â']) 
+1

Gracias por su entrada ptomato, pero representa los caracteres incorrectos cuando uso u "é" o unicode ('é', 'latin-1'), ¿estos funcionan para usted? – OldJim

+0

Sí, esos funcionan para mí. Como dices en tu actualización, fue tu codificación de archivo la que causó el problema. – ptomato

+0

No funciona para ciertos caracteres, p. u'ő ' –

7

Sure. Puede usar TeX:

from matplotlib import rcParams 
rcParams['text.usetex'] = True 
ax = ... # Axes object 
ax.set_yticklabels(['$\'{e}$', '$\tilde{a}$', '$\hat{a}$']) 
+0

Usando tex works, pero dado que el texto que se va a representar está en una base de datos (unicode) tendré que "convertirlo" cada vez, o hay una solución más fácil aquí? – OldJim

+0

Oh, está bien. Sí, entonces esta solución podría ser molesta. Usa la otra solución. –

5

También tuve este problema en concreto cuando yo estaba tratando de utilizar la función de anotaciones. Aquí fue mi mensaje de error:

ValueError: matplotlib display text must have all code points < 128 or use Unicode strings 

Y aquí es lo que solía resolver este:

"accented string i.e. sāo paulo".decode('utf-8') 
0

de matplotlib importación rc

rcParams['text.latex.unicode']=True 
Cuestiones relacionadas