如何使用 matplotlib 自动删除?

我想创建一个 matplotlib 饼图,其中每个楔形的价值写在楔形的顶部。

文件建议我应该使用 autopct来做这件事。

Autopct: [ None | format string | 格式函数] 如果不是“无”,则为用于标记楔形的字符串或函数 它们的数值。标签将为 放置在楔子内。如果它是一个 格式化字符串时,标签将为 如果它是一个函数,它将 被称为。

不幸的是,我不确定这个格式字符串或格式函数应该是什么。

使用下面这个基本的例子,我如何显示每个数值顶部的楔形?

plt.figure()
values = [3, 12, 5, 8]
labels = ['a', 'b', 'c', 'd']
plt.pie(values, labels=labels) #autopct??
plt.show()
144704 次浏览

autopct允许您使用 Python 字符串格式显示百分比值。例如,如果是 autopct='%.2f',那么对于每个饼状楔形,格式字符串是 '%.2f',而该楔形的数值百分比值是 pct,因此楔形标签被设置为字符串 '%.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()

产量 Simple pie chart with percentages

您可以通过向 autopct提供一个可调用的方式来做一些更好的事情。要同时显示百分比值和原始值,您可以这样做:

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()

Pie chart with both percentages and absolute numbers.

同样,对于每个饼状楔形,matplotlib 提供百分比值 pct作为参数,不过这次将它作为参数发送给函数 my_autopct。楔形标签设置为 my_autopct(pct)

val=int(pct*total/100.0)

应该是

val=int((pct*total/100.0)+0.5)

防止舍入误差。

你可以这样做:

plt.pie(values, labels=labels, autopct=lambda p : '{:.2f}%  ({:,.0f})'.format(p,p * sum(values)/100))

使用 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()

enter image description here

在 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))

显示样本食谱配料的数量和百分比的图表

显示工资和编程语言用户百分比的饼状图

由于 autopct是一个 函数,用于标记楔子的数值,您可以写在那里任何标签或格式的项目数量与它作为您的需要。对我来说,显示百分比标签最简单的方法是使用 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()

结果就是:

result

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%%'