Setting Different error bar colors in bar plot in matplotlib

后端 未结 2 1713
[愿得一人]
[愿得一人] 2020-12-09 15:56

Following Setting Different Bar color in matplotlib Python

I would like to change the error bar colors. I have figured out a way after a number of attempts:

相关标签:
2条回答
  • 2020-12-09 16:06

    If you just want to set them to a single color, use the error_kw kwarg (expected to be a dict of keyword arguments that's passed on to ax.errorbar).

    Also, just so you know, you can pass a sequence of facecolors directly to bar, though this won't change the errorbar color.

    As a quick example:

    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

    However, if you want the errorbars to be different colors, you'll either need to plot them individually or modify them afterwards.

    If you use the latter option, the capline colors actually can't be changed individually (note that they're not changed in @falsetru's example either). For example:

    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

    The caplines object in the answer above is a tuple of two Line2Ds: One line for all of the top caps, and one line for all of the bottom caps. There's not way to change the colors of the caps individually (it's easy to set them all to the same color) without removing that artist and creating a LineCollection in its place.

    Therefore, you're better off just plotting the errorbars individually in this case.

    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()
    

    enter image description here

    0 讨论(0)
  • 2020-12-09 16:09

    Not a general solution neither, but here it is.

    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
    
    0 讨论(0)
提交回复
热议问题