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

