在matplotlib的饼图中使用波斯数字
Using Persian numbers in pie charts of matplotlib
我有一个用 matplotlib
创建的饼图,我使用波斯文本作为标签:
In [1]: import matplotlib.pyplot as plt
In [2]: from bidi.algorithm import get_display
In [3]: from arabic_reshaper import reshape
In [4]: labels = ["گروه اول", "گروه دوم", "گروه سوم", "گروه چهارم"]
In [5]: persian_labels = [get_display(reshape(l)) for l in labels]
In [6]: sizes = [1, 2, 3, 4]
In [7]: plt.rcParams['font.family'] = 'Sahel'
In [8]: plt.pie(sizes, labels=persian_labels, autopct='%1.1f%%')
In [9]: plt.savefig("pie.png", dpi=200)
结果如我所料:
现在我也想将百分比数字更改为波斯语。所以必须使用 [۰, ۱, ۲, ۳, ۴, ۵, ۶, ۷, ۸, ۹]
.
而不是 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
我可以使用如下函数轻松地将英文数字转换为波斯文数字:
def en_to_fa(text):
import re
mapping = {
'0': '۰',
'1': '۱',
'2': '۲',
'3': '۳',
'4': '۴',
'5': '۵',
'6': '۶',
'7': '۷',
'8': '۸',
'9': '۹',
'.': '.',
}
pattern = "|".join(map(re.escape, mapping.keys()))
return re.sub(pattern, lambda m: mapping[m.group()], str(text))
但我不知道如何将此函数应用于 matplotlib
生成的百分比。有可能吗?
您可以为 autopct
传递一个函数,而不仅仅是一个字符串格式化程序。所以基本上,您只需将 en_to_fa
传递给 autopct
,并进行一些小的修改:您只需要先将您的数字转换为具有适当数字格式的字符串,然后进行语言转换。我的机器没有为波斯语设置,但下面演示了方法(将数字映射到字母表的前 10 个字母):
import matplotlib.pyplot as plt
def num_to_char(num, formatter='%1.1f%%'):
num_as_string = formatter % num
mapping = dict(list(zip('0123456789.%', 'abcdefghij.%')))
return ''.join(mapping[digit] for digit in num_as_string)
sizes = range(1, 5)
plt.pie(sizes, autopct=num_to_char)
plt.savefig("pie.png", dpi=200)
我有一个用 matplotlib
创建的饼图,我使用波斯文本作为标签:
In [1]: import matplotlib.pyplot as plt
In [2]: from bidi.algorithm import get_display
In [3]: from arabic_reshaper import reshape
In [4]: labels = ["گروه اول", "گروه دوم", "گروه سوم", "گروه چهارم"]
In [5]: persian_labels = [get_display(reshape(l)) for l in labels]
In [6]: sizes = [1, 2, 3, 4]
In [7]: plt.rcParams['font.family'] = 'Sahel'
In [8]: plt.pie(sizes, labels=persian_labels, autopct='%1.1f%%')
In [9]: plt.savefig("pie.png", dpi=200)
结果如我所料:
现在我也想将百分比数字更改为波斯语。所以必须使用 [۰, ۱, ۲, ۳, ۴, ۵, ۶, ۷, ۸, ۹]
.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
我可以使用如下函数轻松地将英文数字转换为波斯文数字:
def en_to_fa(text):
import re
mapping = {
'0': '۰',
'1': '۱',
'2': '۲',
'3': '۳',
'4': '۴',
'5': '۵',
'6': '۶',
'7': '۷',
'8': '۸',
'9': '۹',
'.': '.',
}
pattern = "|".join(map(re.escape, mapping.keys()))
return re.sub(pattern, lambda m: mapping[m.group()], str(text))
但我不知道如何将此函数应用于 matplotlib
生成的百分比。有可能吗?
您可以为 autopct
传递一个函数,而不仅仅是一个字符串格式化程序。所以基本上,您只需将 en_to_fa
传递给 autopct
,并进行一些小的修改:您只需要先将您的数字转换为具有适当数字格式的字符串,然后进行语言转换。我的机器没有为波斯语设置,但下面演示了方法(将数字映射到字母表的前 10 个字母):
import matplotlib.pyplot as plt
def num_to_char(num, formatter='%1.1f%%'):
num_as_string = formatter % num
mapping = dict(list(zip('0123456789.%', 'abcdefghij.%')))
return ''.join(mapping[digit] for digit in num_as_string)
sizes = range(1, 5)
plt.pie(sizes, autopct=num_to_char)
plt.savefig("pie.png", dpi=200)