堆叠条形图百分比求和异常及最后条形比例值定位修正问询
问题修复方案
问题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()
关键修复点说明
unstack(fill_value=0):确保所有分组都有留任和离职的数值,避免NaN导致的比例计算错误grouped_data[[0,1]].sum(axis=1):仅统计核心数据列的总和,保证比例计算的基准正确,总和必然为100%if height > 0::过滤无效的零高度条形注释,解决最后一个条形的定位混乱问题
内容的提问来源于stack exchange,提问作者gracenz
相关产品推荐
相关产品推荐

