Гистограмма, показывающая нечетную линию ошибки

Черная линия ошибки в середине горизонтальной гистограммы ниже очень длинная, несмотря на то, что stds:

array([  1.14428879e-01,   3.38164768e-01,   5.58287430e-01,
         7.77484276e-01,   9.95380202e-01,   1.58493526e-08,
         8.69720905e-02,   8.64435493e-02,   5.12989176e-03])

введите здесь описание изображения

Код для построения этого был:

  pl.barh(ind,means,align='center',xerr=stds,ecolor='k', alpha=0.3)

Почему это?


person Amelio Vazquez-Reina    schedule 29.08.2013    source источник
comment
Ни одна из нанесенных на график погрешностей не соответствует тому, что было нанесено на график. Не могли бы вы добавить больше деталей к вопросу, возможно, пример данных + скрипт для воспроизведения ошибки.   -  person Greg    schedule 29.08.2013
comment
У меня была такая же мысль, но я думаю, что столбцы строятся снизу вверх.   -  person lmjohns3    schedule 29.08.2013
comment
Ах, я вижу, моя ошибка!   -  person Greg    schedule 29.08.2013


Ответы (1)


Погрешности на вашем графике верны. Возьмите, например. самый длинный, со значением 9.95380202e-01 = 0.9953802021.0. Когда вы передаете массив значений N×1 в xerr, значения отображаются как ± значение, т. е. они будут занимать в два раза больше длины. Таким образом, xerr со значением 1.0 охватит 2.0 единиц, от width - 1.0 до width + 1.0. Чтобы избежать этого, вы можете создать массив 2×N, где одна строка состоит только из нулей, см. пример ниже.


Из документации pyplot.bar() (то же самое относится к pyplot.barh()):

Подробности: xerr и yerr передаются непосредственно в errorbar(), поэтому они могут также имеют форму 2xN для независимой спецификации нижней и верхней ошибок.

Из документации pyplot.errorbar():

xerr/yerr: [ скаляр | N, Nx1 или 2xN в виде массива]

Если это скалярное число, объект, подобный массиву len(N), или объект, подобный массиву Nx1, планки погрешностей рисуются со значением +/- относительно данных.

Если последовательность формы 2xN, планки погрешностей рисуются в -row1 и +row2 относительно данных.


Пример, показывающий различные «комбинации» полос ошибок:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(9)
y = np.random.rand(9) * 10

stds = np.array([1.14428879e-01, 3.38164768e-01, 5.58287430e-01,
                 7.77484276e-01, 9.95380202e-01, 1.58493526e-08,
                 8.69720905e-02, 8.64435493e-02, 5.12989176e-03])

# Create array with only positive errors
pos_xerr = np.vstack((np.zeros(len(stds)), stds))

# Create array with only negative errors
neg_xerr = np.vstack((stds, np.zeros(len(stds))))

#Create array with different positive and negative error
both_xerr = np.vstack((stds, np.random.rand(len(stds))*2))

fig, ((ax, ax2),(ax3, ax4)) = plt.subplots(2,2, figsize=(9,5))

# Plot centered errorbars (+/- given value)
ax.barh(x, y, xerr=stds, ecolor='k', align='center', alpha=0.3)
ax.set_title('+/- errorbars')
# Plot positive errorbars
ax2.barh(x, y, xerr=pos_xerr, ecolor='g', align='center', alpha=0.3)
ax2.set_title('Positive errorbars')
# Plot negative errorbars
ax3.barh(x, y, xerr=neg_xerr, ecolor='r', align='center', alpha=0.3)
ax3.set_title('Negative errorbars')
# Plot errorbars with different positive and negative error
ax4.barh(x, y, xerr=both_xerr, ecolor='b', align='center', alpha=0.3)
ax4.set_title('Different positive and negative error')

plt.tight_layout()

plt.show()

Различные комбинации xerr

person sodd    schedule 29.08.2013
comment
Отличный ответ и очень полезный. Спасибо. - person Amelio Vazquez-Reina; 29.08.2013