21

Is there a way to get Matplotlib to render accented chars (é,ã,â,etc)?

For instance, I'm trying to use accented characters on set_yticklabels() and Matplotlib renders squares instead, and when I use unicode() it renders the wrong characters.

Is there a way to make this work?

It turns out you can use u"éã", but first you have to set the file encoding:

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

After that Matplotlib correctly renders

u"é"

I also learned that you can use

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

in case you need to render a characters that Matplotlib does not have.

3
  • Good question. Unicode has a rich repertoire of mathematical symbols, and I would hope that Unicode would work when used. Commented Mar 9, 2010 at 8:09
  • Is there a way to mimic this behaviour using the interactive mode? (For example, I'm using IPython.) The trick with using font manager didn't work for me. Commented Mar 21, 2011 at 20:30
  • Nevermind, this is an issue with IPython itself. Commented Mar 21, 2011 at 21:36

4 Answers 4

16

Prefix the strings with u to tell Python that they are Unicode strings:

ax.set_yticklabels([u'é', u'ã', u'â'])
Sign up to request clarification or add additional context in comments.

4 Comments

Thanks for your input ptomato but it renders the wrong characters when i use u"é" or unicode('é','latin-1'), do these work for you?
Yes, those work for me. As you say in your update, it was your file encoding that was causing the problem.
What happens with those certain characters? I am guessing you did not include coding: utf8 in a comment at the top of the file.
@DrunkenMaster see the answer for stackoverflow.com/questions/10960463/…
8

Sure. You can use TeX:

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

2 Comments

Using tex works, but since the text to be rendered is in a database (unicode) i will have to "convert" it every time, or there is a easier solution here?
Oh, okay. Yeah, then this solution might be annoying. Use the other solution.
5

I also had this problem specifically when I was trying to use the annotate function. Here was my error message:

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

And here's what I used to resolve this:

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

Comments

1

from matplotlib import rc

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.