如何对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
相关产品推荐
相关产品推荐

