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

如何基于Dataframe在Seaborn柱状图中实现柱状条降序排列?

用Seaborn绘制带分组的降序柱状图

没问题,我来帮你搞定这个需求!要实现x轴为Class、y轴为Percentage、以Age为分组标签(hue),同时让柱状条按数值降序排列的柱状图,我们可以分步骤来操作:

核心思路

你提到的“针对Class列对Percentage列降序排序”的方向是对的,但需要明确排序的依据:是让x轴的Class整体按对应Percentage的总和/均值降序,还是让每个Class内的Age分组按Percentage降序?下面分别给出两种场景的实现方法。


场景1:x轴Class按整体Percentage降序排列

这种情况是让整个x轴的Class类别按该类别下Percentage的总和(或均值)从大到小排列,代码示例如下:

首先导入所需库:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

假设你的DataFrame名为df,我们先计算每个Class的Percentage总和,然后生成降序的Class顺序列表:

# 按Class分组计算总Percentage,降序排序后提取Class名称
class_order = df.groupby('Class')['Percentage'].sum().sort_values(ascending=False).index.tolist()

然后用Seaborn绘制柱状图,通过order参数指定x轴Class的顺序:

plt.figure(figsize=(10, 6))
sns.barplot(
    x='Class',
    y='Percentage',
    hue='Age',
    data=df,
    order=class_order  # 关键:设置x轴Class的降序顺序
)

# 添加图表装饰
plt.title('Percentage by Class and Age (Class Sorted Descending)')
plt.xlabel('Class')
plt.ylabel('Percentage')
plt.legend(title='Age Group')
plt.show()

场景2:每个Class内的Age分组按Percentage降序排列

如果需要每个Class下的不同Age柱子按Percentage从大到小排列,我们可以先对数据进行排序,再指定hue_order:

# 先按Class分组,再对每个组内的Percentage降序排序
df_sorted = df.sort_values(['Class', 'Percentage'], ascending=[True, False])

# 提取排序后的Class和Age顺序
class_order = df_sorted['Class'].unique()
hue_order = df_sorted['Age'].unique()

plt.figure(figsize=(10, 6))
sns.barplot(
    x='Class',
    y='Percentage',
    hue='Age',
    data=df_sorted,
    order=class_order,
    hue_order=hue_order
)

plt.title('Percentage by Class and Age (Each Class Group Sorted Descending)')
plt.xlabel('Class')
plt.ylabel('Percentage')
plt.legend(title='Age Group')
plt.show()

小提示

  • 如果你的排序依据是均值而非总和,只需把groupby里的sum()换成mean()即可。
  • barplot默认会对同一x轴类别的数据取均值并绘制误差棒,如果不需要误差棒,可以添加参数ci=None。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:29:38