Как правильно наложить matplotlib.errorbar на seaborn.barplot? - PullRequest
3 голосов
/ 15 апреля 2019

Я пытаюсь наложить некоторые экспериментальные данные на некоторые смоделированные данные в seaborn.barplot. Проблема в том, что я не могу понять, как извлечь расположение стержней на оси х. Вот минимальный пример:

    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 Ответ

1 голос
/ 15 апреля 2019

Вы можете получить координаты x и y линейных патчей, используя get_xy() на прямоугольных патчах, которые будут возвращать кортеж (x, y) координат.Чтобы получить координаты в центре полосы, вам нужно добавить половину ширины полосы.

Обратите внимание, что вам, возможно, придется увеличить zorder в plt.errorbar, если вы хотите, чтобы они отображались сверхугистограммы

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...