首页 > 解决方案 > 带有扭曲的熊猫堆积条形图

问题描述

作为漂亮图表的新手,我希望我能得到人群的帮助:

我想创建一个带有一些规格的堆积条形图

  1. 该条Totals将标有其百分比混合列Type(见下文)
  2. 图中的索引,YearCrncy这种情况下,应该是水平的,最好不要重复(见下图)
  3. 下图中的(Total, Total)行是有一个单独的(右)y轴(见下图)和一个标签,如上图1所示

一些模拟数据:

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)

>>

在此处输入图像描述

但我所追求的,应该看起来更像这样:

在此处输入图像描述

很感谢任何形式的帮助。

也许有一种更简单的方法可以解决这个问题,或者你们有一些更直观的数据呈现方式——我愿意接受建议,谢谢。

/N

标签: pythonpandasdataframe

解决方案


推荐阅读