如何按类别总计数排序seaborn堆叠histplot直方图
问题描述
我通过如下代码处理得到DataFrame对象df_grouped:
df_grouped = df.groupby(['A', 'B'])['A'].count().sort_values(ascending=False) df_grouped = pd.DataFrame(df_grouped) new_index = pd.MultiIndex.from_tuples(df_grouped.index) df_grouped.index = new_index df_grouped.reset_index(inplace=True) df_grouped.columns = ['A', 'B', 'count']
处理完成后的df_grouped数据结构如下:
| A | B | count |
|---|---|---|
| A_1 | B_1 | 10 |
| A_1 | B_2 | 51 |
| A_1 | B_3 | 25 |
| A_1 | B_4 | 12 |
| A_1 | B_5 | 2 |
| A_2 | B_1 | 19 |
| A_2 | B_3 | 5 |
| A_3 | B_5 | 18 |
| A_3 | B_4 | 33 |
| A_3 | B_5 | 44 |
| A_4 | B_1 | 29 |
| A_5 | B_2 | 32 |
我使用如下代码绘制seaborn.histplot堆叠直方图:
fig, ax = plt.subplots(1, 1, figsize=(10,5)) sns.histplot(x='A', hue='B', data=df_grouped, ax=ax, multiple='stack', weights='count')
运行代码后得到的可视化效果如下:
需求:按照A列每个取值对应的总计数,对X轴上的A类别柱子进行排序,尝试多种方法均未实现目标。
实现方法
目前已经验证可行的实现逻辑:先按A列分组计算count列的总和,生成total_count字段,再按照total_count对数据集做降序排序,对应代码如下:
df_grouped['total_count'] = df_grouped.groupby(by='A')['count'].transform('sum') df_grouped = df_grouped.sort_values(by=['total_count'], ascending=False)
数据排序完成后,直接复用之前的绘图代码即可得到符合预期的排序后堆叠直方图。该实现思路和Redox提出的方案逻辑相近,也可以尝试其他实现方案达成同样效果。
内容的提问来源于stack exchange,提问作者Kelo
相关产品推荐
相关产品推荐

