Верхний предел с верхней ошибкой - PullRequest
0 голосов
/ 29 августа 2018

Возможно ли иметь верхний предел (со стрелкой вниз) с точкой, центрированной по наилучшему значению, и в то же время с верхней ошибкой?

Примерно так:

enter image description here

Я пытаюсь с:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([10, 15, 20, 25, 30, 35])
x_el = np.array([1, 1, 2, 25, 1, 2, 1])
x_eu = np.array([1, 1, 2, 1, 1, 2, 1])
y = np.array([29, 15, 9, 10, 25, 14])
y_el = np.array([1, 1, 2, 1, 1, 2, 1])
y_eu = np.array([11,1,2,1,1,2,1])

fig, ax = plt.subplots()

for i in range(len(x)):
    if (x[i] - x_el[i]) == 0:
        el = 0
        ax.errorbar(x[i], y[i], yerr=[[y_el[i]], [y_eu[i]]], xerr=[[el],[x_eu[i]]],
                    c='b', capsize=2, elinewidth=1, marker='o',
                    xuplims=True)
    else:
        ax.errorbar(x[i], y[i], yerr=[[y_el[i]], [y_eu[i]]], xerr=[[x_el[i]], [x_eu[i]]],
                    c='b', capsize=2, elinewidth=1, marker='o')

Но это результат:

enter image description here

Точка № 4 не имеет ни верхней, ни верхней ошибки.

1 Ответ

0 голосов
/ 30 августа 2018

Короткий ответ - да, но вы должны построить верхние пределы и столбцы ошибок отдельно. Давайте начнем с правильного построения ваших нормальных полос ошибок. Вы можете сделать это без зацикливания, если ваши данные уже находятся в массиве:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([10, 15, 20, 25, 30, 35])
x_el = np.array([1, 1, 2, 25, 1, 2])
x_eu = np.array([1, 1, 2, 1, 1, 2])
y = np.array([29, 15, 9, 10, 25, 14])
y_el = np.array([1, 1, 2, 1, 1, 2])
y_eu = np.array([11, 1, 2, 1, 1, 2])

fig, ax = plt.subplots()

mask = (x != x_el)

ax.errorbar(x, y, yerr=[y_el, y_eu], xerr=[x_el * mask, x_eu],
            c='b', capsize=2, elinewidth=1, marker='o', linestyle='none')

Обратите внимание, что я обрезал массивы строк ошибок до того же размера, что и x, что позволяет мне вычислять маску с помощью оператора !=. Поскольку вас интересует наличие всех строк ошибок, кроме одного в x_el, я умножаюсь на маску. Маска является логическим значением, и любая замаскированная полоса ошибок будет просто обнуляться таким образом. В этот момент все остальные бары отображаются правильно:

enter image description here

Теперь вы можете использовать ту же маску (но перевернутую), чтобы построить верхние пределы:

ax.errorbar(x[~mask], y[~mask], xerr=x_el[~mask],
            c='b', capsize=2, elinewidth=1, marker='o', linestyle='none',
            xuplims=True)

Результат

enter image description here

Если вас не интересует неприлично длинная стрелка, которая растягивается до нуля, вы можете сократить ее до любого размера, который вам нравится:

ax.errorbar(x[~mask], y[~mask], xerr=1,
            c='b', capsize=2, elinewidth=1, marker='o', linestyle='none',
            xuplims=True)

enter image description here

Альтернативные

Вы могли бы даже приблизиться к одному вызову построения графика, поскольку xuplims принимает массив логических значений. Тем не менее, везде, где установлено значение True, будет устранена правая полоса:

mask = (x == x_el)
ax.errorbar(x, y, yerr=[y_el, y_eu], xerr=[x_el, x_eu],
            c='b', capsize=2, elinewidth=1, marker='o', linestyle='none',
            xuplims=mask)

enter image description here

В конечном итоге вам необходимо заполнить правильные столбцы в этом случае:

ax.errorbar(x[mask], y[mask], xerr=[np.zeros_like(x_eu)[mask], x_eu[mask]],
            c='b', capsize=2, elinewidth=1, marker='o', linestyle='none')

enter image description here

...