如何在Matplotlib中绘制分组数据均值?求修正代码均值位置错误
问题分析与修正
你的代码存在两个关键错误,导致均值的数值和位置都不符合预期:
1. 均值计算未按Target分组
你当前计算的是整个Condition的全局均值,而非每个Target下对应Condition的分组均值,所以每个Target的同Condition均值完全一致,不符合分组展示的需求。
2. 手动设置的x轴偏移与stripplot的dodge规则不匹配
你手动定义的偏移量(±0.325、±0.075)是固定值,但seaborn的dodge=True会根据分组数量自动调整偏移,手动值和实际分组位置不对应,导致均值线条错位。
修正后的代码
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt data = pd.read_csv("PB1_MG_5.8.csv") # 绘制散点图,保留ax对象用于后续操作 ax = sns.stripplot(data=data, x='Target', y='Value', edgecolor='black', jitter=True, dodge=True, linewidth=1, hue="Condition", hue_order=['NoNS2','NS2'], alpha=0.3) sns.despine() ax.legend(['-NS2','+NS2'], bbox_to_anchor=(1.05, 0.7), loc=2, borderaxespad=0., frameon=False, title='PB1') plt.ylabel('log$2$(1600/length)') plt.xticks(rotation=45, ha='right') ax.set_yscale('log', base=2) ax.set_ylim(1,8) # 映射Target到对应的x轴位置(分类变量对应0、1、2) target_pos_map = {t: idx for idx, t in enumerate(['200nt', '400nt', '800nt'])} # 使用seaborn dodge默认偏移量(两组hue时,每组偏移0.2) dodge_offset = 0.2 for target, x_pos in target_pos_map.items(): # 计算当前Target下NoNS2的分组均值 mean_nons2 = data[(data['Target'] == target) & (data['Condition'] == 'NoNS2')]['Value'].mean() # 绘制NoNS2的均值线,对齐散点分组位置 plt.plot([x_pos - dodge_offset, x_pos], [mean_nons2, mean_nons2], lw=4, c='k', zorder=9) # 计算当前Target下NS2的分组均值 mean_ns2 = data[(data['Target'] == target) & (data['Condition'] == 'NS2')]['Value'].mean() # 绘制NS2的均值线,对齐散点分组位置 plt.plot([x_pos, x_pos + dodge_offset], [mean_ns2, mean_ns2], lw=4, c='k', zorder=9)
修正说明
- 均值计算:通过
(data['Target'] == target) & (data['Condition'] == 'xxx')同时筛选Target和Condition,得到每个分组的正确均值。 - 位置对齐:使用seaborn默认的dodge偏移量,和stripplot的分组位置完全匹配,避免手动偏移的误差。如果需要更精准的偏移值,可以通过
ax.collections提取散点的实际位置数据进行计算。
内容的提问来源于stack exchange,提问作者Sharmada Swaminath
相关产品推荐
相关产品推荐

