如何在matplotlib饼图中显示实际值(Python)?

发布于 2021-01-29 16:58:27

我有一个饼图,绘制了从CSV文件提取的值。当前显示值的比例,并显示百分比“ autopct =’%1.1f
%%’”。有没有一种方法可以显示每个切片在数据集中表示的实际值。

#Pie for Life Expectancy in Boroughs
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt

# show plots inline
%matplotlib inline

# use ggplot style
matplotlib.style.use('ggplot')

#read data
lifeEx = pd.read_csv('LEpie.csv')

#Select columns
df = pd.DataFrame()
df['LB'] = lifeEx[['Regions']]
df['LifeEx'] = lifeEx[['MinLF']]
colorz = ['#B5DF00','#AD1FFF', '#BF1B00','#5FB1FF','#FFC93F']
exploda = (0, 0, 0, 0.1, 0)


#plotting
plt.pie(df['LifeEx'], labels=df['LB'], colors=colorz, autopct='%1.1f%%', explode = exploda, shadow = True,startangle=90)

#labeling
plt.title('Min Life expectancy across London Regions', fontsize=12)
关注者
0
被浏览
243
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    使用autopct关键字

    我们知道显示的百分比乘以所有实际值的总和必须是实际值,我们可以将其定义为一个函数,并plt.pie使用autopct关键字将此函数提供给该函数。

    import matplotlib.pyplot as plt
    import numpy
    
    labels = 'Frogs', 'Hogs', 'Dogs'
    sizes = numpy.array([5860, 677, 3200])
    colors = ['yellowgreen', 'gold', 'lightskyblue']
    
    def absolute_value(val):
        a  = numpy.round(val/100.*sizes.sum(), 0)
        return a
    
    plt.pie(sizes, labels=labels, colors=colors,
            autopct=absolute_value, shadow=True)
    
    plt.axis('equal')
    plt.show()
    

    由于计算涉及一些错误,因此必须小心,因此提供的值仅精确到小数点后一位。

    下面的函数可能会更高级一些,该函数尝试通过比较计算值和输入数组之间的差异,从输入数组中获取原始值。该方法不存在不准确性的问题,而是依赖于彼此足够不同的输入值。

    def absolute_value2(val):
        a  = sizes[ numpy.abs(sizes - val/100.*sizes.sum()).argmin() ]
        return a
    

    创建饼图后更改文本

    另一种选择是先用百分比值绘制饼图,然后再替换它们。为此,可以存储由返回的autopct标签,plt.pie()并在其上循环以用原始数组中的值替换文本。注意,提供关键字plt.pie()时,仅返回三个参数,最后一个是感兴趣的标签,autopct因此在此将其设置为空字符串。

    labels = 'Frogs', 'Hogs', 'Dogs'
    sizes = numpy.array([5860, 677, 3200])
    colors = ['yellowgreen', 'gold', 'lightskyblue']
    
    p, tx, autotexts = plt.pie(sizes, labels=labels, colors=colors,
            autopct="", shadow=True)
    
    for i, a in enumerate(autotexts):
        a.set_text("{}".format(sizes[i]))
    
    plt.axis('equal')
    plt.show()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看