Python 如何将matplotlib.errorbar正确叠加到seaborn.barplot上?

Python 如何将matplotlib.errorbar正确叠加到seaborn.barplot上?,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,我试图在一个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) })

我试图在一个
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()
然后给


如何修改此代码以获得与条形一致的错误?

您可以使用矩形面片上的
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)

可能也值得增加zorder,因为垂直误差条似乎位于条形图的后面。在我发布之后,我注意到了这一点。我现在已经更新了答案,非常重要的一点是:使用中的数据帧需要按色调列排序。