我正在尝试将一些实验数据与seaborn.barplot
中的某些模拟数据叠加。问题是我无法弄清楚如何提取x轴上的钢筋位置。这是一个最小的示例:
simulated_data = pandas.DataFrame({
'condition': ['A']*4 + ['B']*4,
'Protein': ['w', 'x', 'y', 'z']*2,
'data': numpy.random.uniform(10, 11, 8)
})
experimental_data = pandas.DataFrame({
'condition': ['A']*4 + ['B']*4,
'Protein': ['w', 'x', 'y', 'z']*2,
'data': numpy.random.uniform(10, 11, 8)
})
errors = pandas.DataFrame({
'condition': ['A']*4 + ['B']*4,
'Protein': ['w', 'x', 'y', 'z']*2,
'data': numpy.random.uniform(0, 1, 8)
})
plt.figure()
seaborn.barplot(data=simulated_data, y='data', x='Protein', hue='condition')
plt.errorbar(range(simulated_data.shape[0]), experimental_data['data'], yerr=errors['data'],
marker='_', mec='blue', zorder=1, elinewidth=1, capsize=2, ecolor='blue',
linestyle="None", markersize=10
)
plt.show()
然后给出
如何修改此代码以使错误与条形一致?
答案 0 :(得分:1)
您可以在矩形色块上使用get_xy()
来获取条形色块的x和y位置,这将返回(x,y)坐标的元组。为了使坐标位于条的中心,您需要添加条宽度的一半。
请注意,如果您希望它们显示在条形图的顶部,则可能必须增加plt.errorbar
中的zorder
import seaborn as sns
plt.figure()
abar = sns.barplot(data=simulated_data, y='data', x='Protein', hue='condition')
x_list = []
for patch in abar.patches:
x_list.append(patch.get_xy()[0]+(patch._width/2))
plt.errorbar(x_list, experimental_data['data'], yerr=errors['data'],
marker='_', mec='blue', zorder=10, elinewidth=1, capsize=2, ecolor='blue',
linestyle="None", markersize=10)