使用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
相关产品推荐
相关产品推荐

