关于基于技师评估数据集绘制多类别分组条形图(Cat Plot)是否需重构数据集的技术问询
实现技师评估通过次数的分组条形图
首先,咱们先明确核心需求:你需要按技师分组,每个组里的条形对应不同评估类别的通过次数。针对你的问题,我分两种实用方案来解答:
方案1:用Seaborn Catplot(推荐,轻量数据转换)
虽然Seaborn的catplot更适配长格式(整洁)数据,但你不需要“彻底重构”原始数据集,只需要两步简单的聚合和格式转换,完全是数据分析中的常规操作:
步骤1:计算每个技师每个类别的通过次数
先把你的示例数据转成DataFrame,然后按技师分组,对每个评估类别求和(因为1代表通过,求和结果就是该类别的通过次数):
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 你的原始数据 data = [{"Name":"A","cat1":1,"cat2":0},{"Name":"A","cat1":1,"cat2":1},{"Name": "B", "cat1":0, "cat2":1}] df = pd.DataFrame(data) # 聚合计算通过次数 summary_df = df.groupby('Name')[['cat1', 'cat2']].sum().reset_index()
步骤2:转成长格式适配Seaborn
用melt把宽格式转成长格式,这一步只是把多列的评估类别转成单独的Category列,操作非常轻量,不会改动原始数据集:
long_df = summary_df.melt(id_vars='Name', var_name='Category', value_name='Pass_Count')
步骤3:绘制分组条形图
现在就可以用hue参数轻松实现分组条形效果:
sns.catplot(x='Name', y='Pass_Count', hue='Category', kind='bar', data=long_df) plt.title('Technician Assessment Pass Counts') plt.show()
方案2:手动用Matplotlib绘制(无需转长格式)
如果你不想做长格式转换,也可以基于聚合后的宽格式数据,直接用Matplotlib手动构建分组条形:
# 先得到聚合后的通过次数统计 summary_df = df.groupby('Name')[['cat1', 'cat2']].sum().reset_index() # 设置绘图基础参数 names = summary_df['Name'] categories = ['cat1', 'cat2'] x = range(len(names)) bar_width = 0.35 # 创建画布和轴 fig, ax = plt.subplots() # 分别绘制两组条形 ax.bar([i - bar_width/2 for i in x], summary_df['cat1'], bar_width, label='cat1') ax.bar([i + bar_width/2 for i in x], summary_df['cat2'], bar_width, label='cat2') # 美化图表细节 ax.set_xticks(x) ax.set_xticklabels(names) ax.set_ylabel('Pass Count') ax.set_xlabel('Technician Name') ax.legend(title='Assessment Category') plt.title('Technician Assessment Pass Counts') plt.show()
关键说明
你提到“无需完全重构数据集”——其实完全不做任何数据转换是不可能的,因为原始数据是每条记录对应一次评估,你必须先计算每个技师每个类别的通过次数(这一步是核心逻辑)。但上面两种方案都不需要修改原始数据集,只是生成了一个小的聚合/转换后的中间数据集,完全算不上“彻底重新格式化”。
如果追求代码简洁和Seaborn的自带美观样式,方案1是首选;如果想避开长格式转换,方案2也能完美实现需求。
内容的提问来源于stack exchange,提问作者user23415
相关产品推荐
相关产品推荐

