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

使用Pandas绘制自定义规格堆叠柱状图的问题求助

堆叠柱状图定制需求

作为可视化图表制作新手,需要绘制满足以下规则的堆叠柱状图:

  • 所有标注为Totals的柱子需要标注其对应Type列的百分比构成
  • 图表中的索引(本例中为Year和Crncy)需要水平展示,且尽量避免重复展示
  • 图表中(Total, Total)行对应的柱子需使用独立的右侧y轴,且同上要求标注占比

模拟数据

data={'Year':[2021, 2021, 2021, 2021, 2022, 2022, 2023, 2024, 2024, 2025, 2026, 2027, 2027, 2027],'Crncy':['GBP', 'SEK', 'USD', 'USD', 'SEK', 'SEK', 'SEK', 'EUR', 'EUR', 'EUR', 'USD', 'EUR', 'EUR', 'SEK'],'Type':['Fixed', 'Float', 'Fixed', 'Float', 'Fixed', 'Float', 'Float', 'Fixed', 'Float', 'Fixed', 'Float', 'Fixed', 'Float', 'Float'],'Amount':[100, 200, 300, 400, 500, 100, 150, 600, 800, 500.0, 200, 50, 50, 100]}
df = pd.DataFrame(data)
a=df.groupby(['Year','Type'])['Amount'].sum().reset_index()
b=df.groupby(['Type'])['Amount'].sum().reset_index()
a['Crncy']='Total'
b['Crncy']='Total'
b['Year']='Total'
df=pd.concat([df,a,b]).reset_index(drop=True)

已完成计算步骤

目前已完成分组百分比数据计算,代码如下:

a=df.groupby(['Year','Crncy','Type'])['Amount'].sum()
b=a.div(a.sum(level=[0,1]))*100

计算结果示例:

Year   Crncy  Type 
2021   GBP    Fixed    100.000000
       SEK    Float    100.000000
       Total  Fixed     40.000000
              Float     60.000000
       USD    Fixed     42.857143
              Float     57.142857
2022   SEK    Fixed     83.333333
              Float     16.666667
       Total  Fixed     83.333333
              Float     16.666667
2023   SEK    Float    100.000000
       Total  Float    100.000000
2024   EUR    Fixed     42.857143
              Float     57.142857
       Total  Fixed     42.857143
              Float     57.142857
2025   EUR    Fixed    100.000000
       Total  Fixed    100.000000
2026   Total  Float    100.000000
       USD    Float    100.000000
2027   EUR    Fixed     50.000000
              Float     50.000000
       SEK    Float    100.000000
       Total  Fixed     25.000000
              Float     75.000000
Total  Total  Fixed     50.617284
              Float     49.382716

当前实现与效果

当前对原DataFrame df做透视后绘制堆叠柱状图,代码如下:

df.reset_index().sort_values(by=['Year','Crncy','Type']).pivot_table(index=['Year','Crncy'],columns='Type',values='Amount').fillna(0.0).plot.bar(stacked=True)

当前实现效果:
当前实现效果

期望实现效果:
期望效果

欢迎提供更简便的实现方案,或是更直观的数据呈现思路。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:39:02