Seaborn绘制区分两类用户的catplot柱状图效果异常求助
问题根因
两次代码运行不符合预期的核心原因是参数映射和数据预处理逻辑错误:
- 第一次调用
catplot时错误使用melt将error_message转为x轴维度,所有数据被聚合到单个x轴类别下,同时按study拆分了独立子图,完全不符合「x轴展示12个功能项、同功能项下并排展示两类用户报错数」的目标结构。 - 第二次调用
barplot时未提前对数据做聚合校验,原始数据存在重复分组维度,导致柱子分组错位、高度计算错误。
正确实现方案
前置要求
先确认你的数据源结构符合规范,核心包含3个字段:
function:报错对应的功能项,共12个枚举值M1_pass:报错计数度量,单条报错记录对应值为1即可study:用户群体分类,取值为活跃用户、非活跃用户两类
可直接运行的代码
import seaborn as sns import matplotlib.pyplot as plt # 先按维度聚合计算总报错数,避免内置estimator计算偏差 df_agg = df_grp_pass.groupby(['function', 'study'], as_index=False)['M1_pass'].sum() # 设置画布尺寸适配12个功能项的展示 sns.set_style("whitegrid") plt.figure(figsize=(13, 6)) # 绘制分组柱状图 ax = sns.barplot( data=df_agg, x='function', y='M1_pass', hue='study', palette=['#4472C4', '#ED7D31'] # 匹配Excel默认的蓝橙配色,对齐参考图视觉效果 ) # 图表样式调整 ax.set_xlabel('功能项', fontsize=11) ax.set_ylabel('报错数量', fontsize=11) plt.xticks(rotation=45, ha='right') # 旋转x轴标签避免文字重叠 plt.legend(title='用户群体') # 可选:给每个柱子添加数值标签,和Excel图表效果对齐 for p in ax.patches: height = p.get_height() ax.text( p.get_x() + p.get_width()/2, height + 0.5, f'{int(height)}', ha='center', va='bottom', fontsize=9 ) plt.tight_layout() plt.show()
注意事项
- 如果你的
df_grp_pass已经是聚合后的中间表,要保证function和study的组合没有重复值,否则求和会出现重复计算的问题。 - 如果需要调整柱子宽度、颜色、排序,可以在
barplot中传入width、order参数自定义。
内容的提问来源于stack exchange,提问作者Chapin
相关产品推荐
相关产品推荐

