关注Setting Different Bar color in 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]
根本不是一般解决方案。
答案 0 :(得分:53)
如果您只想将它们设置为单一颜色,请使用error_kw
kwarg(预期是传递给ax.errorbar
的关键字参数的字典)。
另外,您也知道,您可以将一系列面部颜色直接传递给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()
但是,如果您希望错误栏的颜色不同,则需要单独绘制它们或者之后修改它们。
如果你使用后一个选项,实际上不能单独更改标题颜色(注意它们在@fattru的例子中也没有改变)。例如:
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()
上面答案中的caplines
对象是两个Line2D
s的元组:所有顶部大写的一行,以及所有底部大写的一行。无法单独更改大写字母的颜色(很容易将它们全部设置为相同的颜色),而无需移除该艺术家并在其位置创建LineCollection
。
因此,在这种情况下,最好只是单独绘制错误栏。
E.g。
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()
答案 1 :(得分:1)
既不是一般解决方案,也不是。
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