我如何使用matplotlib autopct?

Kim*_*Kim 45 python matplotlib

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

文件建议我应该使用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()
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 101

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()
Run Code Online (Sandbox Code Playgroud)

产量 简单的饼图与百分比

你可以通过提供一个可调用来做更好的事情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()
Run Code Online (Sandbox Code Playgroud)

带有百分比和绝对数字的饼图.

同样,对于每个饼形楔,matplotlib提供百分比值pct作为参数,尽管这次它作为参数发送到函数my_autopct.楔形标签设置为my_autopct(pct).

  • @cosmos1990:`plt.pie`期望`autopct`函数是一个变量的函数,百分比值,`pct`.但是,您可以[关闭](http://effbot.org/zone/closure.htm) - "一个可以引用不再活动的环境的函数".我编辑了上面的帖子来展示如何.现在`values`传递给`make_autopct`,`make_autopct(values)`返回*closure*`my_autopct`.当调用`my_autopct`时,它会在`make_autopct`的[封闭范围](http://stackoverflow.com/questions/291978/short-description-of-python-scoping-rules)中查找`values`. (2认同)

Kan*_*hew 12

autopct使您能够使用 Python 字符串格式显示每个切片的百分比值。

例如,

autopct = '%.1f' # display the percentage value to 1 decimal place
autopct = '%.2f' # display the percentage value to 2 decimal places
Run Code Online (Sandbox Code Playgroud)

如果你想在饼图上显示%符号,你必须编写/添加:

autopct = '%.1f%%'
autopct = '%.2f%%' 
Run Code Online (Sandbox Code Playgroud)


Mar*_*ova 8

作为用于用数值标记楔形的函数autopct,您可以根据需要在其中写入任何标签或格式化项目数量。对我来说显示百分比标签的最简单方法是使用 lambda:

autopct = lambda p:f'{p:.2f}%'
Run Code Online (Sandbox Code Playgroud)

或者在某些情况下,您可以将数据标记为

autopct = lambda p:'any text you want'
Run Code Online (Sandbox Code Playgroud)

对于您的代码,要显示您可以使用的百分比:

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()
Run Code Online (Sandbox Code Playgroud)

结果将是这样的:

结果


小智 7

你可以做:

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


小智 6

val=int(pct*total/100.0)
Run Code Online (Sandbox Code Playgroud)

应该

val=int((pct*total/100.0)+0.5)
Run Code Online (Sandbox Code Playgroud)

防止舍入错误.


bla*_*eep 5

使用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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明