如何在Python中实现按BU分组的降序堆叠柱状图?
解决按BU分组、Sub-BU降序的堆叠柱状图问题
问题背景
你需要绘制满足以下要求的堆叠柱状图:
- X轴显示
Sub - BU,并按总计数降序排列 - 按
BU分组,每个BU使用专属颜色 - 堆叠展示
Contract Sum Type的计数
之前尝试通过fig.update_layout设置排序无效,核心原因是错误地针对Y轴设置排序,而非X轴的Sub - BU类别。
解决方案
1. 生成Sub-BU的降序排列规则
首先从统计后的counts_df中提取每个Sub - BU的总计数,按降序排序得到X轴的显示顺序:
# 获取Sub-BU按总计数降序的排列列表 sub_bu_sorted = counts_df.groupby('Sub - BU')['Total Count'].first().sort_values(ascending=False).index.tolist()
2. 绘制符合要求的堆叠柱状图
使用Plotly Express绘制图表,通过category_orders指定X轴排序,用color绑定BU实现专属颜色,启用堆叠模式:
import plotly.express as px # 自定义BU专属颜色(可选,也可使用默认配色) bu_color_map = { 'A': '#1f77b4', 'B': '#ff7f0e', 'C': '#2ca02c', 'D': '#d62728', 'E': '#9467bd' } fig = px.bar( counts_df, x='Sub - BU', y='Count', color='BU', # 按BU分配专属颜色 barmode='stack', # 启用堆叠模式 title='Initial Contract Sum by Sub-BU (Grouped by BU)', text_auto=True, color_discrete_map=bu_color_map, category_orders={'Sub - BU': sub_bu_sorted} # 强制X轴按指定顺序排列 ) # 优化布局(可选) fig.update_layout( xaxis_title='Sub-BU', yaxis_title='Count', legend_title='BU' ) fig.show()
关键调整说明
- 排序逻辑:使用
category_orders直接指定X轴Sub - BU的排列顺序,这是Plotly中控制类别轴排序的标准方式,之前错误地修改了Y轴的排序参数。 - 颜色分组:通过
color='BU'让每个BU拥有专属颜色,配合color_discrete_map可自定义颜色方案。 - 堆叠模式:如果需要改为按Contract Sum Type堆叠、BU分组并列显示,只需将
barmode改为'group',并调整color为'Contract Sum Type'即可。
内容的提问来源于stack exchange,提问作者hvahva
相关产品推荐
相关产品推荐

