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

