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

如何对Pandas水平堆叠条形图的单条分段按大小排序?

实现每个条形最大分段置于最外侧的水平堆叠条形图

这个需求很好实现,核心思路就是在绘图前,对每个主类别对应的所有子类别分段,按数值大小重新排序,让最大的分段对应到水平堆叠的最外侧(也就是条形的最右端)。具体修改后的代码和解释如下:

修改后的完整代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 生成原始数据
arrays = [np.array(['bar', 'bar', 'bar', 'baz', 'baz', 'baz', 'foo', 'foo', 'foo', 'qux', 'qux', 'qux']), 
          np.array(['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'])]
s = abs(pd.Series(np.random.randn(12), index=arrays))

# 关键步骤:对每个主类别(行)的分段按数值降序排序
df_unstacked = s.unstack(level=1)
# axis=1表示按行处理,每行内的数值从大到小排序,最大的分段会排在该行的最后一列
df_sorted = df_unstacked.apply(lambda row: row.sort_values(ascending=False), axis=1)

# 绘制水平堆叠条形图
ax = df_sorted.plot.barh(stacked=True, colormap='Paired')
plt.show()

核心逻辑解释

  • 原始代码中s.unstack(level=1)会把多层索引的Series转换成每行对应一个主类别(bar/baz/foo/qux)、每列对应一个子类别(one/two/.../twelve)的DataFrame。
  • 我们用apply方法对每一行执行排序:row.sort_values(ascending=False)会把当前行的所有分段按数值从大到小排列。
  • 水平堆叠条形图的堆叠顺序是按照列的顺序来的:先出现的列会被绘制在条形的最左侧,后出现的列会叠加在右侧(也就是最外侧)。所以降序排序后,最大的分段会被放在每行的最后一列,自然就出现在条形的最外侧了。

内容的提问来源于stack exchange,提问作者arturomp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:08:21