Matplotlib中的重音字符

21

有没有办法让Matplotlib渲染带重音符号的字符(如é、ã、â等)?

例如,我正在尝试在set_yticklabels()上使用带重音符号的字符,但是Matplotlib会渲染出方块,而当我使用unicode()时,它会渲染出错误的字符。

有没有方法可以解决这个问题?

事实证明,您可以使用u"éã",但首先必须设置文件编码:

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

之后Matplotlib正确地渲染

u"é"

我还学到了可以使用

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

如果您需要渲染Matplotlib没有的字符。


好问题。Unicode拥有丰富的数学符号,我希望在使用时Unicode可以正常工作。 - Craig McQueen
有没有办法在交互模式下模仿这种行为?(例如,我正在使用IPython。)使用字体管理器的技巧对我不起作用。 - lubomir.brindza
没事了,这是一个 IPython 本身的问题。 - lubomir.brindza
4个回答

16

在字符串前加上u,告诉Python这是Unicode字符串:

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

1
谢谢您的回复,ptomato。但是当我使用u"é"或unicode('é','latin-1')时,它会渲染错误的字符,这对您有效吗? - OldJim
是的,那些对我有效。正如您在更新中所说,导致问题的是您的文件编码。 - ptomato
那些特殊字符会发生什么事情?我猜你没有在文件顶部的注释中包含“coding:utf8”。 - ptomato
@DrunkenMaster请查看https://dev59.com/DGgu5IYBdhLWcg3w8bhs中的非ASCII字符的答案。 - abukaj

8
当然可以。您可以使用TeX:
from matplotlib import rcParams
rcParams['text.usetex'] = True
ax = ... # Axes object
ax.set_yticklabels(['$\'{e}$', '$\tilde{a}$', '$\hat{a}$'])

使用Tex Works是可以的,但由于要渲染的文本存储在数据库中(unicode编码),我每次都需要进行“转换”,或者这里有一个更简单的解决方案吗? - OldJim
哦,好的。是的,那么这个解决方案可能会很烦人。使用另一个解决方案吧。 - Steve Tjoa

5

当我尝试使用注释功能时,我也遇到了这个问题。下面是我的错误信息:

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

以下是我用来解决这个问题的方法:

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

1

从matplotlib导入rc

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接