在饼图上显示数值和百分比。

11

这是我的当前代码

values = pd.Series([False, False, True, True])
v_counts = values.value_counts()
fig = plt.figure()
plt.pie(v_counts, labels=v_counts.index, autopct='%.4f', shadow=True);

目前,它只显示百分比(使用autopct

我想同时展示百分比和实际值(位置无所谓)


1
这个主题的许多内容已经在这里讨论过:https://dev59.com/gW025IYBdhLWcg3wLipX。因此,请考虑查看这些答案。 - tschomacker
2个回答

16

创建您自己的格式化函数。请注意,在该函数中,您必须以某种方式从百分比中重新计算出实际值。

def my_fmt(x):
    print(x)
    return '{:.4f}%\n({:.0f})'.format(x, total*x/100)


values = pd.Series([False, False, True, True, True, True])
v_counts = values.value_counts()
total = len(values)
fig = plt.figure()
plt.pie(v_counts, labels=v_counts.index, autopct=my_fmt, shadow=True);

在此输入图片描述


10
@diziet-asahi的代码对我无效,您可以使用以下代码:
    def autopct_format(values):
        def my_format(pct):
            total = sum(values)
            val = int(round(pct*total/100.0))
            return '{:.1f}%\n({v:d})'.format(pct, v=val)
        return my_format

plt.pie(mydata,labels = mylabels, autopct=autopct_format(mydata))

这是我的输出结果:

输入图像描述

注意:如果你想要更多小数位,只需要在 my_format(pct) 的返回值中改变数字即可。


1
@diziet-asahi的代码对我有效,但是我更喜欢这个解决方案,因为它更加自包含(不依赖于未作为参数传递的全局变量)。然而,这个版本在我这里没有起作用,直到我替换了原始帖子和其他解决方案中使用的变量:plt.pie(v_counts, labels=v_counts.index, autopct=autopct_format(values)) - gumption
谢谢您的评论,对我来说它仍然有效,我每天都在使用,真的很奇怪。我猜这取决于您的数据格式是如何的。 - Santiago Domínguez Collado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接