python - 在 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
. 甚至可能吗?
解决方案
您可以传入一个函数 for autopct
,而不仅仅是一个字符串格式化程序。所以基本上,你可以通过你的en_to_fa
to 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)
推荐阅读
- java - Java注解创建构造函数
- c++ - 标头中声明的非模板函数用于导致 /bin/ld 的模板函数:DWARF 错误:找不到变量规范
- linux - 在linux中创建每日日志脚本
- c++ - 打开 cv 不读取图像
- python - Django Crispy Forms:为文本区域设置行
- javascript - 在 Vue 中使用 Cloud Firestore 更新布尔值
- maven - 在环境变量中添加 java/bin 路径
- python - 如何使用 discord.py 重写中的类中的方法创建命令?
- python - Python Multiprocessing:多次执行具有随机性的函数并获得相同的结果
- swi-prolog - 声明模块本地化运算符时 SWI-Prolog 失败