You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

堆叠条形图百分比求和异常及最后条形比例值定位修正问询

问题修复方案

问题1:部分条形百分比总和不为100%

原因:计算Total时,sum(axis=1)会把work_accident、salary这两个分类列也纳入求和,导致总数值偏大,比例计算错误;同时unstack()后部分分组会出现缺失值(NaN),进一步影响比例准确性。

修复步骤:

  • 执行unstack时添加fill_value=0,填充缺失值
  • 计算Total仅针对离职状态的两列(0代表留任、1代表离职)求和

问题2:最后一个条形比例值定位错误

原因:当某组数据中Left比例为0时,对应条形高度为0,注释文本会被绘制在底部造成视觉干扰;原代码未过滤这类无效注释。

修复步骤:

  • 遍历条形时判断高度是否大于0,仅对有效高度的条形添加注释

修复后的完整代码

# 按工伤、薪资、离职状态分组统计人数
grouped_data = df1.groupby(['work_accident', 'salary', 'left']).size().unstack(fill_value=0).reset_index()

# 计算每组总人数(仅统计留任/离职的人数)
grouped_data['Total'] = grouped_data[[0, 1]].sum(axis=1)

# 计算留任/离职的比例
grouped_data['Stay'] = grouped_data[0] / grouped_data['Total']
grouped_data['Left'] = grouped_data[1] / grouped_data['Total']

# 绘制堆叠条形图
fig, ax = plt.subplots(figsize=(14, 4))
grouped_data[['Stay', 'Left']].plot(kind='bar', stacked=True, ax=ax)

# 设置标签与标题
ax.set_xlabel('工伤情况与薪资水平')
ax.set_ylabel('比例')
ax.set_title('工伤、薪资与员工留存的关系')

# 为每个有效条形添加比例注释
for p in ax.patches:
    height = p.get_height()
    if height > 0:
        width = p.get_width()
        x, y = p.get_xy()
        ax.annotate(f'{height:.2%}', (x + width / 2, y + height / 2), ha='center', va='center')

# 设置X轴刻度标签
x_labels = ['无工伤-低薪', '无工伤-中薪', '无工伤-高薪',
            '有工伤-低薪', '有工伤-中薪', '有工伤-高薪']
ax.set_xticklabels(x_labels, rotation=45, ha='right')

# 设置图例位置
ax.legend(['留任', '离职'], loc='bottom left', bbox_to_anchor=(1, 1.02))

# 展示图表
plt.show()

关键修复点说明

  1. unstack(fill_value=0):确保所有分组都有留任和离职的数值,避免NaN导致的比例计算错误
  2. grouped_data[[0,1]].sum(axis=1):仅统计核心数据列的总和,保证比例计算的基准正确,总和必然为100%
  3. if height > 0::过滤无效的零高度条形注释,解决最后一个条形的定位混乱问题

内容的提问来源于stack exchange,提问作者gracenz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:07:42