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

如何在Barplot中以多列为X轴并按UEB_score拆分柱状条

实现分组拆分柱状图的解决方案

要实现你需要的拆分柱状图,必须重构DataFrame为长格式——这是用seaborn/matplotlib做分组柱状图的标准要求,而且不会影响你后续的多元回归(原始数据可以保留不动,只复制需要的部分做可视化处理)。下面是具体步骤和代码:

步骤1:准备数据(宽转长+分组标记)

首先提取所有TUT前缀的列,把宽格式数据转成适合分组的长格式,同时给UEB_score做分组标记:

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

# 假设你的原始DataFrame名为df,这里先模拟示例数据(你可以替换成自己的df)
data = {
    'TUT_1': [10, 20, 15, 5],
    'TUT_2': [8, 12, 9, 7],
    'TUT_3': [5, 15, 10, 20],
    'UEB_score': [3, 2, 3, 1],
    'reg_col1': [1, 2, 3, 4],  # 后续回归用的列,不影响可视化
    'reg_col2': [0.5, 0.8, 0.3, 0.6]
}
df = pd.DataFrame(data)

# 提取所有TUT前缀的列
tut_cols = [col for col in df.columns if col.startswith('TUT')]

# 宽转长,保留UEB_score列
melted_df = df.melt(
    id_vars=['UEB_score'],
    value_vars=tut_cols,
    var_name='TUT_category',  # X轴的类别列
    value_name='value'        # Y轴的数值列
)

# 给数据打分组标签:区分UEB_score=3和其他情况
melted_df['group'] = melted_df['UEB_score'].map(lambda x: 'UEB_score=3' if x == 3 else '其他')

步骤2:聚合计算(按需选择总和/均值)

根据你Y轴的需求(是显示总和还是均值),对数据做分组聚合:

# 按TUT类别和分组,计算数值总和(如果要均值就把sum()改成mean())
aggregated_df = melted_df.groupby(['TUT_category', 'group'])['value'].sum().reset_index()

步骤3:绘制拆分柱状图

用seaborn的barplot,通过hue参数实现柱子的拆分:

plt.figure(figsize=(10, 6))
sns.barplot(
    data=aggregated_df,
    x='TUT_category',
    y='value',
    hue='group',
    palette='Set2'  # 可选:自定义配色
)

# 添加图表标签
plt.title('TUT类别拆分柱状图')
plt.xlabel('TUT类别')
plt.ylabel('数值总和')  # 如果用均值就改成「数值均值」
plt.legend(title='分组')

plt.show()

关键说明

  • 重构数据不会修改原始DataFrame,你可以继续用原始数据做后续的多元回归分析。
  • 如果你的Y轴需要的是每行的原始值(而非聚合后的总和/均值),可以直接用melted_df绘图,但这种情况柱子会叠加,通常聚合后更直观。
  • 如果你用matplotlib原生绘图,逻辑类似:先计算每个分组的数值,再用bar函数手动设置柱子宽度和位置实现拆分,但seaborn的barplot更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:53:14