Python新手实现各公司文档准时/逾期提交占比堆叠柱状图的问题
原代码核心问题
- 原代码仅统计了每个公司提交量在全量文档中的整体占比,完全没有纳入「是否逾期」的布尔列作为分组维度,绘图时只有单一系列数据,自然无法生成堆叠效果。
- 堆叠柱状图的实现前提是,每个X轴类别(公司)对应至少2个分类的数值(准时提交占比、逾期提交占比),因此需要先按两个维度交叉统计出每个公司内部的两类状态占比,再执行绘图。
可直接运行的实现步骤
- 构造交叉占比统计表
我们需要计算每家公司内部,准时、逾期文档的占比(每家公司的两类占比加和为100%),使用pd.crosstab可以快速实现这个统计:# 请将Is_OnTime替换为你实际的布尔状态列名(该列True=准时提交,False=逾期提交) status_by_company = pd.crosstab( index=df13['Originator Company'], columns=df13['Is_OnTime'], normalize='index' ) # crosstab默认按布尔值顺序生成列(False在前,True在后),此处调整列名让图例更易读 status_by_company.columns = ['逾期提交', '准时提交'] # 可选:按准时提交占比从高到低排序X轴的公司顺序 status_by_company = status_by_company.sort_values(by='准时提交', ascending=False) - 绘制堆叠柱状图
拿到交叉统计表后,再调用pandas的绘图接口,开启堆叠参数即可:import matplotlib.ticker as mtick import matplotlib.pyplot as plt ax = status_by_company.plot( kind='bar', stacked=True, title='Companies % On-Time', ylabel='Percentage', xlabel='Originator Company' ) # 将Y轴格式化为百分比展示 ax.yaxis.set_major_formatter(mtick.PercentFormatter(xmax=1, symbol='%')) # 调整Y轴范围为0到1(即0%-100%) ax.set_ylim([0, 1]) # 调整图例位置避免遮挡柱子 ax.legend(loc='upper right') # 保存图片 plt.savefig("LMCP Contractor.png", bbox_inches='tight')
常见踩坑提示
- 原代码中的
positions = (True, False)属于冗余代码,对绘图逻辑无影响,可直接删除。 - 原代码设置的
ax.set_ylim([0,0.25])是基于“统计每个公司占全量文档比例”的逻辑设计的,换成“统计每个公司内部两类提交状态占比”的逻辑后,每个堆叠柱的总高度为1(即100%),如果保留原范围设置,会把绝大部分柱子内容截断,必须调整为ax.set_ylim([0, 1])。
内容的提问来源于stack exchange,提问作者NICode
相关产品推荐
相关产品推荐

