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

如何实现每小时按值从大到小堆叠的堆叠柱状图?

实现按数值大小排序的堆叠柱状图

问题描述

需要制作堆叠柱状图,要求每个小时对应的堆叠块按数值从大到小排列(底部最大,顶部最小)。现有包含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:16:18