Подтвердить что ты не робот

Установка различных цветов строки ошибок в штриховом графике в matplotlib

Следуя Настройка цвета различных штрихов в matplotlib Python

Я хотел бы изменить цвета панели ошибок. Я выяснил путь после нескольких попыток:

a = plt.gca()
b = a.bar(range(4), [2]*4, yerr=range(4))
c = a.get_children()[8]
c.set_color(['r','r','b','r'])

Есть ли лучший способ? Конечно, a.get_children()[8] вообще не является общим решением.

enter image description here

4b9b3361

Ответ 1

Если вы просто хотите установить их в один цвет, используйте error_kw kwarg (ожидается, что это аргумент ключевого слова, переданный на ax.errorbar).

Кроме того, как вы знаете, вы можете передать последовательность facecolors непосредственно в bar, хотя это не изменит цвет ошибки.

В качестве быстрого примера:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

ax.bar(range(4), [2] * 4, yerr=range(1, 5), alpha=0.5,
       color=['red', 'green', 'blue', 'cyan', 'magenta'],
       error_kw=dict(ecolor='gray', lw=2, capsize=5, capthick=2))
ax.margins(0.05)

plt.show()

enter image description here

Однако, если вы хотите, чтобы метки ошибок были разных цветов, вам придется либо нарисовать их по отдельности, либо изменить их впоследствии.

Если вы используете последний вариант, цвета capline фактически не могут быть изменены индивидуально (обратите внимание, что они также не изменены в примере @falsetru). Например:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
colors = ['red', 'green', 'blue', 'cyan', 'magenta']

container = ax.bar(range(4), [2] * 4, yerr=range(1, 5), alpha=0.5, color=colors,
       error_kw=dict(lw=2, capsize=5, capthick=2))
ax.margins(0.05)

connector, caplines, (vertical_lines,) = container.errorbar.lines
vertical_lines.set_color(colors)

plt.show()

enter image description here

Объект caplines в ответе выше представляет собой набор из двух Line2D s: одна строка для всех верхних шапок и одна строка для всех нижних шапок. Там нет способа изменить цвета колпачков индивидуально (легко установить их все на один цвет), не удаляя этого исполнителя и создавая вместо него LineCollection.

Таким образом, вам лучше просто создавать отдельные ошибки в этом случае.

например.

import matplotlib.pyplot as plt

x, height, error = range(4), [2] * 4, range(1,5)
colors = ['red', 'green', 'blue', 'cyan', 'magenta']

fig, ax = plt.subplots()
ax.bar(x, height, alpha=0.5, color=colors)
ax.margins(0.05)

for pos, y, err, color in zip(x, height, error, colors):
    ax.errorbar(pos + 0.4, y, err, lw=2, capsize=5, capthick=2, color=color)

plt.show()

enter image description here

Ответ 2

Не общее решение не существует, но вот оно.

a = plt.gca()
b = a.bar(range(4), [2]*4, yerr=range(4))
c = b.errorbar.lines[2][b.errorbar.has_xerr] # <----
c.set_color(['r', 'r', 'b', 'r'])


# from matplotlib.collections import LineCollection
# next(i
#      for i, x in enumerate(b.errorbar.lines)
#      if x and any(isinstance(y, LineCollection) for y in x)) == 2