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

时间:2019-04-15 09:58:39

标签: 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)
    })

    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()

然后给出

enter image description here

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

1 个答案:

答案 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)

enter image description here