You need to enable JavaScript to run this app. Python新手实现各公司文档准时/逾期提交占比堆叠柱状图的问题
优惠活动
大模型
产品
解决方案
定价
更多

Python新手实现各公司文档准时/逾期提交占比堆叠柱状图的问题

原代码核心问题
  • 原代码仅统计了每个公司提交量在全量文档中的整体占比,完全没有纳入「是否逾期」的布尔列作为分组维度,绘图时只有单一系列数据,自然无法生成堆叠效果。
  • 堆叠柱状图的实现前提是,每个X轴类别(公司)对应至少2个分类的数值(准时提交占比、逾期提交占比),因此需要先按两个维度交叉统计出每个公司内部的两类状态占比,再执行绘图。
可直接运行的实现步骤
  1. 构造交叉占比统计表
    我们需要计算每家公司内部,准时、逾期文档的占比(每家公司的两类占比加和为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)
    
  2. 绘制堆叠柱状图
    拿到交叉统计表后,再调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 02:45:03