2010-03-09 19 views
19

Czy istnieje sposób, aby Matplotlib renderował znaki akcentowane (é, ã, â etc)?Znaki akcentowane w Matplotlib

Na przykład próbuję użyć znaków diakrytycznych na set_yticklabels(), a Matplotlib renderuje kwadraty, a kiedy używam unicode(), renderuje niewłaściwe znaki.

Czy istnieje sposób, aby to zadziałało?

Okazuje się, można użyć U „EA”, ale najpierw trzeba ustawić kodowanie pliku:

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

Po tym matplotlib poprawnie renderuje

u"é" 

Dowiedziałem się też, że można używaj

w przypadku, gdy musisz renderować znaki, których nie ma Matplotlib.

+0

dobre pytanie. Unicode ma bogaty repertuar symboli matematycznych i mam nadzieję, że Unicode zadziała, jeśli zostanie użyty. –

+0

Czy istnieje sposób naśladowania tego zachowania za pomocą trybu interaktywnego? (Na przykład używam IPython.) Sztuczka z użyciem menedżera czcionek nie działa dla mnie. – Halka

+0

Nieważne, jest to problem związany z [samym IPythonem] (https://github.com/ipython/ipython/issues/labels/unicode#issue/25). – Halka

Odpowiedz

14

Prefiks struny z u Python powiedzieć, że są one ciągi Unicode:

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

Dzięki za twój wkład ptomato ale renderuje złe znaki, kiedy używam u "é" lub unicode ("é", "latin-1"), czy te działają dla ciebie? – OldJim

+0

Tak, te działają dla mnie. Jak mówisz w swojej aktualizacji, przyczyną problemu był twój kodowanie plików. – ptomato

+0

Nie działa dla niektórych znaków, np. u'ő ' –

7

Pewnie. Można używać TeX:

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

Używając tex działa, ale ponieważ tekst do renderowania jest w bazie danych (Unicode) będę musiał "przekonwertować" go za każdym razem, czy jest tu łatwiejsze rozwiązanie? – OldJim

+0

Oh, okay. Tak, to rozwiązanie może być denerwujące. Użyj innego rozwiązania. –

5

miałem też ten problem szczególnie kiedy próbuje skorzystać z funkcji adnotacje. Tu był mój komunikat o błędzie:

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

A oto co kiedyś rozwiązać ten problem:

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

z matplotlib importowej rc

rcParams['text.latex.unicode']=True 
Powiązane problemy