我想创建一个matplotlib饼图,其中每个楔形的值都写在楔形顶部。
documentation建议我应该使用autopct
来执行此操作。
autopct:[无|格式字符串| 格式功能] 如果不是None,则是用于标记楔形的字符串或函数 他们的数值。标签将是 放在楔子里面。如果是的话 格式字符串,标签将是 FMT%PCT。如果它是一个功能,它会 被称为。
不幸的是,我不确定这个格式字符串或格式函数应该是什么。
使用下面的基本示例,如何在楔形顶部显示每个数值?
plt.figure()
values = [3, 12, 5, 8]
labels = ['a', 'b', 'c', 'd']
plt.pie(values, labels=labels) #autopct??
plt.show()
答案 0 :(得分:92)
autopct
使您可以使用Python字符串格式显示百分比值。例如,如果autopct='%.2f'
,那么对于每个饼形楔形,格式字符串为'%.2f'
,该楔形的数字百分比值为pct
,因此楔形标签设置为字符串{ {1}}。
'%.2f'%pct
的产率
您可以通过向import matplotlib.pyplot as plt
plt.figure()
values = [3, 12, 5, 8]
labels = ['a', 'b', 'c', 'd']
plt.pie(values, labels=labels, autopct='%.2f')
plt.show()
提供可调用来做更高级的事情。要显示百分比值和原始值,您可以这样做:
autopct
同样,对于每个饼形楔形,matplotlib提供百分比值import matplotlib.pyplot as plt
# make the pie circular by setting the aspect ratio to 1
plt.figure(figsize=plt.figaspect(1))
values = [3, 12, 5, 8]
labels = ['a', 'b', 'c', 'd']
def make_autopct(values):
def my_autopct(pct):
total = sum(values)
val = int(round(pct*total/100.0))
return '{p:.2f}% ({v:d})'.format(p=pct,v=val)
return my_autopct
plt.pie(values, labels=labels, autopct=make_autopct(values))
plt.show()
作为参数,尽管这次它作为参数发送到函数pct
。楔形标签设置为my_autopct
。
答案 1 :(得分:6)
val=int(pct*total/100.0)
应该是
val=int((pct*total/100.0)+0.5)
防止舍入错误。
答案 2 :(得分:4)
您可以这样做:
plt.pie(values, labels=labels, autopct=lambda p : '{:.2f}% ({:,.0f})'.format(p,p * sum(values)/100))
答案 3 :(得分:2)
使用lambda和格式可能会更好
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
path = r"C:\Users\byqpz\Desktop\DATA\raw\tips.csv"
df = pd.read_csv(path, engine='python', encoding='utf_8_sig')
days = df.groupby('day').size()
sns.set()
days.plot(kind='pie', title='Number of parties on different days', figsize=[8,8],
autopct=lambda p: '{:.2f}%({:.0f})'.format(p,(p/100)*days.sum()))
plt.show()
答案 4 :(得分:1)
借助matplotlib画廊和StackOverflow用户的提示,我想到了以下饼图。 自动显示成分的数量和种类。
import matplotlib.pyplot as plt
%matplotlib inline
reciepe= ["480g Flour", "50g Eggs", "90g Sugar"]
amt=[int(x.split('g ')[0]) for x in reciepe]
ing=[x.split()[-1] for x in reciepe]
fig, ax=plt.subplots(figsize=(5,5), subplot_kw=dict(aspect='equal'))
wadges, text, autotext=ax.pie(amt, labels=ing, startangle=90,
autopct=lambda p:"{:.0f}g\n({:.1f})%".format(p*sum(amt)/100, p),
textprops=dict(color='k', weight='bold', fontsize=8))
ax.legend(wadges, ing,title='Ingredents', loc='best', bbox_to_anchor=(0.35,0.85,0,0))
Piechart showing the amount and of percent of a sample recipe ingredients
Pie chart showing the salary and percent of programming Language users
答案 5 :(得分:0)
由于autopct
是function used to label the wedges with their numeric value,因此您可以根据需要在其中写入任何标签或格式化项目数量。对于我来说,显示百分比标签的最简单方法是使用lambda:
autopct = lambda p:f'{p:.2f}%'
或者在某些情况下,您可以将数据标记为
autopct = lambda p:'any text you want'
并为您的代码显示可以使用的百分比:
plt.figure()
values = [3, 12, 5, 8]
labels = ['a', 'b', 'c', 'd']
plt.pie(values, labels=labels, autopct=lambda p:f'{p:.2f}%, {p*sum(values)/100 :.0f} items')
plt.show()
结果将是:
答案 6 :(得分:0)
autopct
使您可以使用Python字符串格式显示每个切片的百分比值。
例如,
autopct = '%.1f' # display the percentage value to 1 decimal place
autopct = '%.2f' # display the percentage value to 2 decimal places
如果要在饼图中显示%符号,则必须编写/添加:
autopct = '%.1f%%'
autopct = '%.2f%%'