我需要帮助添加的百分比分布的总数(没有小数)在每一部分的堆叠条形图在Pandas创建的交叉表在一个 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
,但是我不知道该怎么做。我想把总数的百分比嵌入到堆叠的条形图中。
2条答案
按热度按时间pgky5nke1#
我们试试看:
输出:
ctrmrzij2#
matplotlib 3.4.2
使用matplotlib.pyplot.bar_label
label_type='center'
将使用每个段的值进行注解,而label_type='edge'
将使用段的累积和进行注解。pandas.DataFrame.plot
与kind='bar'
和stacked=True
绘制堆叠条形图最简单*要以矢量化方式获取百分比(无
.apply
):1.使用
pd.crosstab
获取频率计数ct
沿着axis=0
除以ct.sum(axis=1)
.div
和.sum
指定正确的轴非常重要。.crosstab
来完成,因为它会产生一个具有正确形状的 Dataframe ,用于绘制堆叠的条形图。.groupby
将需要对 Dataframe 进行进一步的整形。*在
python 3.10
、pandas 1.3.4
、matplotlib 3.5.0
中测试label_type='edge'
注记累积和一米二十分