如何按行计算百分比并注释 100% 堆积条

How to calculate percent by row and annotate 100 percent stacked bars(如何按行计算百分比并注释 100% 堆积条)
本文介绍了如何按行计算百分比并注释 100% 堆积条的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我需要帮助在从数据帧中的交叉表创建的 pandas 堆积条形图的每个部分中添加总数的百分比分布(无小数).

I need help adding the percent distribution of the total (no decimals) in each section of a stacked bar plot in pandas created from a crosstab in a dataframe.

这里是示例数据:

data = {
    'Name':['Alisa','Bobby','Bobby','Alisa','Bobby','Alisa',
            'Alisa','Bobby','Bobby','Alisa','Bobby','Alisa'],
    'Exam':['Semester 1','Semester 1','Semester 1','Semester 1','Semester 1','Semester 1',
            'Semester 2','Semester 2','Semester 2','Semester 2','Semester 2','Semester 2'],
     
    'Subject':['Mathematics','Mathematics','English','English','Science','Science',
               'Mathematics','Mathematics','English','English','Science','Science'],
   'Result':['Pass','Pass','Fail','Pass','Fail','Pass','Pass','Fail','Fail','Pass','Pass','Fail']}
df = pd.DataFrame(data)

# display(df)
     Name        Exam      Subject Result
0   Alisa  Semester 1  Mathematics   Pass
1   Bobby  Semester 1  Mathematics   Pass
2   Bobby  Semester 1      English   Fail
3   Alisa  Semester 1      English   Pass
4   Bobby  Semester 1      Science   Fail
5   Alisa  Semester 1      Science   Pass
6   Alisa  Semester 2  Mathematics   Pass
7   Bobby  Semester 2  Mathematics   Fail
8   Bobby  Semester 2      English   Fail
9   Alisa  Semester 2      English   Pass
10  Bobby  Semester 2      Science   Pass
11  Alisa  Semester 2      Science   Fail

这是我的代码:

#crosstab
pal = ["royalblue", "dodgerblue", "lightskyblue", "lightblue"]
ax= pd.crosstab(df['Name'], df['Subject']).apply(lambda r: r/r.sum()*100, axis=1)
ax.plot.bar(figsize=(10,10),stacked=True, rot=0, color=pal)
display(ax)
    
plt.legend(loc='best', bbox_to_anchor=(0.1, 1.0),title="Subject",)

plt.xlabel('Name')
plt.ylabel('Percent Distribution')

plt.show()

我知道我需要以某种方式添加 plt.text,但无法弄清楚.我希望将总数的百分比嵌入堆叠的条形图中.

I know I need to add a plt.text some how, but can't figure it out. I would like the percent of the totals to be embedded within the stacked bars.

推荐答案

我们试试吧:

# crosstab
pal = ["royalblue", "dodgerblue", "lightskyblue", "lightblue"]
ax= pd.crosstab(df['Name'], df['Subject']).apply(lambda r: r/r.sum()*100, axis=1)
ax_1 = ax.plot.bar(figsize=(10,10), stacked=True, rot=0, color=pal)
display(ax)

plt.legend(loc='upper center', bbox_to_anchor=(0.1, 1.0), title="Subject")

plt.xlabel('Name')
plt.ylabel('Percent Distribution')

for rec in ax_1.patches:
    height = rec.get_height()
    ax_1.text(rec.get_x() + rec.get_width() / 2, 
              rec.get_y() + height / 2,
              "{:.0f}%".format(height),
              ha='center', 
              va='bottom')
    
plt.show()

输出:


Subject English Mathematics Science
Name            
Alisa   33.333333   33.333333   33.333333
Bobby   33.333333   33.333333   33.333333

这篇关于如何按行计算百分比并注释 100% 堆积条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How do I make a list of all members in a discord server using discord.py?(如何使用 discord.py 列出不和谐服务器中的所有成员?)
how to change discord.py bot activity(如何更改 discord.py 机器人活动)
Issues with getting VoiceChannel.members and Guild.members to return a full list(让 VoiceChannel.members 和 Guild.members 返回完整列表的问题)
Add button components to a message (discord.py)(将按钮组件添加到消息(discord.py))
on_message() and @bot.command issue(on_message() 和@bot.command 问题)
How to edit a message in discord.py(如何在 discord.py 中编辑消息)