如何实现每小时按值从大到小堆叠的堆叠柱状图?
实现按数值大小排序的堆叠柱状图
问题描述
需要制作堆叠柱状图,要求每个小时对应的堆叠块按数值从大到小排列(底部最大,顶部最小)。现有包含24小时时间序列和12个类别的DataFrame,示例生成代码如下:
import pandas as pd import numpy as np bz = ['NO1','NO2','NO3','NO4','NO5','DK1','DK2','FI','SE1','SE2','SE3','SE4'] df = pd.DataFrame(columns=bz, index=range(0,24), data=np.random.randint(0,100,size=(24, 12)))
尝试过逐个小时硬编码排序(比如hour1 = df.loc[:,0].sort_values(ascending=True)),但无法正确完成堆叠绘制。
解决方案
单独对每行排序后未保持堆叠累积逻辑,且列顺序未对应每行的排序结果,导致绘制失败。正确做法是对每行按数值降序排序后重构DataFrame,再绘制堆叠图:
完整代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 生成示例数据 bz = ['NO1','NO2','NO3','NO4','NO5','DK1','DK2','FI','SE1','SE2','SE3','SE4'] df = pd.DataFrame(columns=bz, index=range(0,24), data=np.random.randint(0,100,size=(24, 12))) # 对每个小时的数据按数值降序排序 sorted_df = df.apply(lambda row: row.sort_values(ascending=False), axis=1) # 绘制堆叠柱状图 ax = sorted_df.plot(kind='bar', stacked=True, figsize=(12, 6)) # 优化图表显示 ax.set_xlabel('小时') ax.set_ylabel('数值') ax.set_title('24小时按数值排序的堆叠柱状图') plt.legend(title='类别', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
关键说明
- 行级排序:通过
apply对每行执行降序排序,确保每个小时的类别按数值从高到低排列,重构后的sorted_df每行列顺序对应该小时的数值排序结果。 - 堆叠绘制:pandas的
stacked=True参数会按列顺序堆叠,此时每个小时的底部是数值最大的类别,顶部是最小的,完全符合需求。 - 图例优化:将图例移至图表外侧,避免遮挡堆叠块,提升可读性。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

