Matplotlib:如何书写从右到左的文本(希伯来语、阿拉伯语等)

41
我试图向我的绘图中添加一些文本,该绘图是从右到左(RTL)的(例如希伯来语)。经过一些努力,我设法让文本显示出来,但是它是从左到右(LTR)显示的,也就是说,顺序颠倒了。我查看了参考资料并在网上进行了广泛搜索,但没有找到解决方法。
下面是一个示例:
import matplotlib.pyplot as plt
plt.text(0.5, 0.5, u'שלום כיתה א', name = 'Arial')
plt.show()

它显示为'א התיכ םלוש'。

如果您无法看到希伯来文,就好像我输入了'Hello',输出将是'olleH'。

我无法简单地反转输入,因为它混合了从左到右和从右到左的文本方向。

任何帮助都将不胜感激。


你可以把RTL和LTR的“单词”分开吗?这样在合并所有内容之前,你就可以先翻转RTL的那些。 - ev-br
你的字符串中是否包含显式的Unicode方向字符? - tacaswell
@Zhenya - 不可以。它们是由我的代码提供的,而不是由它组装的。 - Korem
@tcaswell - 我不知道如何检查。但是如果我使用Python的print函数,字符串会正确显示,所以我猜它们在那里。 - Korem
你能解释一下,你是如何在图表中写希伯来文的吗? - Dror Hilman
6个回答

61

对于阿拉伯语,您需要同时使用bidi.algorithm.get_displayarabic_reshaper模块:

from bidi.algorithm import get_display
import matplotlib.pyplot as plt
import arabic_reshaper

reshaped_text = arabic_reshaper.reshape(u'لغةٌ عربيّة')
artext = get_display(reshaped_text)

plt.text(0.25, 0.45, artext , name = 'Times New Roman',fontsize=50)
plt.show()

Python Matplotlib 中的阿拉伯文本


33

对于遇到相同问题的人,我找到了一个部分解决方案。

使用bidi包可以提供此功能,因此可以使用:

from bidi import algorithm as bidialg
import matplotlib.pyplot as plt
text = bidialg.get_display(u'שלום כיתה א')
plt.text(0.5, 0.5, text , name = 'Arial')
plt.show()

显示结果是正确的。

那么为什么只是部分呢? 因为我发现 bidi 包有时会破坏我在 matplotlib 中使用的 LaTeX 表达式。所以需要小心使用。


1
嗨,当我尝试这个时,所有的非英文字母都显示为空白方块,并生成以下错误消息:/usr/local/anaconda3/lib/python3.5/site-packages/matplotlib/font_manager.py:1288: UserWarning: findfont: Font family ['Arial'] not found. Falling back to Bitstream Vera Sans (prop.get_family(), self.defaultFamily[fontext]))看来我需要安装新字体,但是我所有的尝试都失败了。你有什么建议吗? - Rotail

5

您可以通过以下方式尝试翻转文本:

import matplotlib.pyplot as plt
plt.text(0.5, 0.5, (u'שלום כיתה א')[::-1], name = 'Arial')
plt.show()


1
我使用了你的解决方案,它对我很有效! 我只是添加了一个检查,看看这些是否为非拉丁字母:从字符串中导入可打印字符如果 bool(set(text) - set(printable)): text = text[::-1] - Dot Plot

3

我遇到了相同的问题,我认为可以结合@Korem和@Nasser Al-Wohaibi的两个答案来解决:

import arabic_reshaper
from bidi.algorithm import get_display

new_text=get_display(arabic_reshaper.reshape(old_text))

因为只有阿拉伯文字重排器没有重新排列字母,而双向文本支持只是没有将它们组合起来。

0

我知道我的答案并不是解决这个问题的方法,但使用Plotly而不是matplotlib解决了我的问题。它可以正确显示波斯语单词。


-3

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