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

如何用Seaborn绘制分组柱状图?基于给定DataFrame

问题描述

现有如下格式的DataFrame:

model_name        1         2         3         4         5
0  ground_truth  41.333333  12.000000  12.666667  11.333333  22.666667
1      TL_model  73.333333   4.666667   2.666667   4.666667  14.666667
2   other-model  22.000000  21.333333   9.333333  31.333333  16.000000

需要实现:

  • X轴设为[1,2,3,4,5]
  • Y轴对应DataFrame中的频率值(如ground_truth在X=1处的值为41.333)
  • 每个X轴位置旁显示3个并列柱状图,分别对应三个模型的数值
解决方案

Seaborn的barplot需要长格式数据才能正确用hue区分分组,当前宽格式的DataFrame需要先做重塑,具体步骤如下:

1. 数据格式转换

用pandas.melt将宽格式转成长格式,生成三列:model_name(模型名)、x_axis(X轴的1-5)、frequency(对应频率值),这是让hue参数生效的核心前提。

2. 绘制并列柱状图

指定x='x_axis'、y='frequency'、hue='model_name',Seaborn会自动在每个X轴位置生成对应不同模型的并列柱子。

完整代码示例

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

# 构造目标DataFrame
data = {
    'model_name': ['ground_truth', 'TL_model', 'other-model'],
    1: [41.333333, 73.333333, 22.000000],
    2: [12.000000, 4.666667, 21.333333],
    3: [12.666667, 2.666667, 9.333333],
    4: [11.333333, 4.666667, 31.333333],
    5: [22.666667, 14.666667, 16.000000]
}
df = pd.DataFrame(data)

# 宽格式转长格式
melted_df = df.melt(
    id_vars='model_name',
    var_name='x_axis',
    value_name='frequency'
)

# 设置绘图风格
sns.set_style("whitegrid")

# 绘制并列柱状图
plt.figure(figsize=(10, 6))
sns.barplot(
    x='x_axis',
    y='frequency',
    hue='model_name',
    data=melted_df,
    palette='viridis'
)

# 添加标签与标题
plt.xlabel('X轴')
plt.ylabel('频率值')
plt.title('不同模型在X轴各位置的频率对比')
plt.legend(title='模型名称')

plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:00:25