Python如何将堆叠条形图最大区块置于底部?
让堆叠条形图最大区块位于底部的解决方案
我明白你想让堆叠条形图里最大的区块待在最底部的需求,其实核心就是要先确定区域的排序逻辑,再调整透视表的列顺序,这样pandas绘制堆叠图时就会自动把排序靠前(总量最大)的区域放在最底部啦!
解决方案步骤
默认情况下,pivot_table生成的列是按字母顺序排列的,这就是最大区块不在底部的原因。我们可以按区域的全局总数量降序排序,再用这个顺序重新排列透视表的列:
- 计算每个区域的总数量并排序
- 用排序后的区域列表调整透视表的列顺序
- 绘制堆叠条形图
完整代码示例
import pandas as pd import matplotlib.pyplot as plt # 你的原始数据集 dataset = {'Year': [2019,2019,2020,2020,2017,2017,2017,2017,2017,2018,2018,2018,2018,2018,2019,2019,2019,2019,2019,2020, 2020,2020,2020,2020], 'Quantity': [100,50,25,30,40,50,200,600,20,40,100,20,50,400,250,300,125,75,90,10,225,550,450,55], 'Regions': ['Europe','Asia','Africa','Africa','Other','Asia','Africa','Other','America','America','Europe','Europe', 'Other','Europe','Asia','Africa','Asia','Europe','Other','Africa','Europe','Asia','Africa','Europe']} df = pd.DataFrame(data=dataset) # 计算各区域的全局总数量,按降序排序得到区域顺序 region_totals = df.groupby('Regions')['Quantity'].sum().sort_values(ascending=False) sorted_regions = region_totals.index.tolist() # 生成透视表,并按排序后的区域顺序调整列 df_pt = df.pivot_table(index='Year', columns='Regions', values='Quantity')[sorted_regions] # 绘制堆叠条形图 df_pt.plot.bar(stacked=True, figsize=(10, 6)) plt.title('Stacked Bar Chart with Largest Segment at Bottom') plt.ylabel('Total Quantity') plt.show()
原理说明
pandas的堆叠条形图是按列的顺序从下往上堆叠的,我们把总数量最大的区域列放在最前面,它就会自动成为每个条形最底部的区块,后续依次往上是总量更小的区域。同时这种方式能保证每个区域的颜色固定,方便读者理解图表。
可选:按单年份内的数量排序(不推荐)
如果你需要每个年份单独按区块大小排序(每个年份的最大区块在底部,但区域顺序可能随年份变化),可以用下面的代码,但要注意这种方式会导致区域颜色不固定,可读性较差:
# 对每个年份的数值单独降序排序 df_pt_sorted_per_year = df_pt.apply(lambda x: x.sort_values(ascending=False).reset_index(drop=True), axis=1) df_pt_sorted_per_year.plot.bar(stacked=True, figsize=(10,6)) plt.show()
内容的提问来源于stack exchange,提问作者Killi Mandjaro
相关产品推荐
相关产品推荐

