Короткий ответ - да, но вы должны построить верхние пределы и столбцы ошибок отдельно. Давайте начнем с правильного построения ваших нормальных полос ошибок. Вы можете сделать это без зацикливания, если ваши данные уже находятся в массиве:
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
, я умножаюсь на маску. Маска является логическим значением, и любая замаскированная полоса ошибок будет просто обнуляться таким образом. В этот момент все остальные бары отображаются правильно:

Теперь вы можете использовать ту же маску (но перевернутую), чтобы построить верхние пределы:
ax.errorbar(x[~mask], y[~mask], xerr=x_el[~mask],
c='b', capsize=2, elinewidth=1, marker='o', linestyle='none',
xuplims=True)
Результат

Если вас не интересует неприлично длинная стрелка, которая растягивается до нуля, вы можете сократить ее до любого размера, который вам нравится:
ax.errorbar(x[~mask], y[~mask], xerr=1,
c='b', capsize=2, elinewidth=1, marker='o', linestyle='none',
xuplims=True)

Альтернативные
Вы могли бы даже приблизиться к одному вызову построения графика, поскольку 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)

В конечном итоге вам необходимо заполнить правильные столбцы в этом случае:
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')
