Seaborn柱状图中误差棒与柱子对齐问题求助
解决Seaborn柱状图误差棒与柱子错位的问题
问题出在你用行索引i作为plt.errorbar的x坐标,但当使用hue参数时,Seaborn会为同一Type下的不同Groups柱子分配偏移的x位置,行索引和这些实际坐标不匹配,导致误差棒错位。下面是两种可行的解决方案:
方案1:让Seaborn自动绘制误差棒(推荐)
如果你的dfpp5已经是按Type和Groups聚合后的结果(每行对应一个柱子的均值、下限、上限),可以直接利用Seaborn的errorbar参数指定误差范围,无需手动添加:
plt.figure(figsize=(16, 6)) # 计算上下误差值 dfpp5['err_low'] = dfpp5['survival'] - dfpp5['lower'] dfpp5['err_high'] = dfpp5['upper'] - dfpp5['survival'] # 整理成Seaborn要求的误差格式 errors = [dfpp5['err_low'], dfpp5['err_high']] # 绘制带误差棒的柱状图 g = sns.barplot( data=dfpp5, x='Type', y='survival', palette=colours, hue='Groups', hue_order=hue_order, errorbar=errors, # 指定自定义误差 capsize=5, # 误差棒帽子大小 errcolor='black' # 误差棒颜色 )
注意:该方案需要Seaborn版本≥0.12.0,若版本过低,执行
pip install --upgrade seaborn升级即可。
方案2:手动获取柱子坐标对齐误差棒
如果坚持手动添加误差棒,可以先获取每个柱子的实际中心x坐标,再对应添加:
plt.figure(figsize=(16, 6)) # 先绘制无默认误差棒的柱状图 g = sns.barplot( data=dfpp5, x='Type', y='survival', palette=colours, hue='Groups', hue_order=hue_order, ci=None ) # 获取所有柱子的对象 bars = g.patches # 确保数据行顺序与柱子绘制顺序一致(若不一致,先对dfpp5按Type和hue_order排序) for bar, (_, row) in zip(bars, dfpp5.iterrows()): # 计算柱子的中心x坐标 x_center = bar.get_x() + bar.get_width() / 2 # 添加误差棒 plt.errorbar( x=x_center, y=row['survival'], yerr=[[row['survival'] - row['lower']], [row['upper'] - row['survival']]], fmt='none', capsize=5, color='black' )
提示:如果数据行顺序和柱子顺序不匹配,先对
dfpp5排序,比如:dfpp5 = dfpp5.sort_values(['Type', 'Groups'], key=lambda col: col.map(hue_order) if col.name == 'Groups' else col)
内容的提问来源于stack exchange,提问作者Dyf50
相关产品推荐
相关产品推荐

