Search code examples
pythonmatplotlibboxplot

How to create grouped boxplots


Is there a way to group boxplots in matplotlib?

Assume we have three groups "A", "B", and "C" and for each we want to create a boxplot for both "apples" and "oranges". If a grouping is not possible directly, we can create all six combinations and place them linearly side by side. What would be to simplest way to visualize the groupings? I'm trying to avoid setting the tick labels to something like "A + apples" since my scenario involves much longer names than "A".


Solution

  • How about using colors to differentiate between "apples" and "oranges" and spacing to separate "A", "B" and "C"?

    Something like this:

    from pylab import plot, show, savefig, xlim, figure, \
                    hold, ylim, legend, boxplot, setp, axes
    
    # function for setting the colors of the box plots pairs
    def setBoxColors(bp):
        setp(bp['boxes'][0], color='blue')
        setp(bp['caps'][0], color='blue')
        setp(bp['caps'][1], color='blue')
        setp(bp['whiskers'][0], color='blue')
        setp(bp['whiskers'][1], color='blue')
        setp(bp['fliers'][0], color='blue')
        setp(bp['fliers'][1], color='blue')
        setp(bp['medians'][0], color='blue')
    
        setp(bp['boxes'][1], color='red')
        setp(bp['caps'][2], color='red')
        setp(bp['caps'][3], color='red')
        setp(bp['whiskers'][2], color='red')
        setp(bp['whiskers'][3], color='red')
        setp(bp['fliers'][2], color='red')
        setp(bp['fliers'][3], color='red')
        setp(bp['medians'][1], color='red')
    
    # Some fake data to plot
    A= [[1, 2, 5,],  [7, 2]]
    B = [[5, 7, 2, 2, 5], [7, 2, 5]]
    C = [[3,2,5,7], [6, 7, 3]]
    
    fig = figure()
    ax = axes()
    hold(True)
    
    # first boxplot pair
    bp = boxplot(A, positions = [1, 2], widths = 0.6)
    setBoxColors(bp)
    
    # second boxplot pair
    bp = boxplot(B, positions = [4, 5], widths = 0.6)
    setBoxColors(bp)
    
    # thrid boxplot pair
    bp = boxplot(C, positions = [7, 8], widths = 0.6)
    setBoxColors(bp)
    
    # set axes limits and labels
    xlim(0,9)
    ylim(0,9)
    ax.set_xticklabels(['A', 'B', 'C'])
    ax.set_xticks([1.5, 4.5, 7.5])
    
    # draw temporary red and blue lines and use them to create a legend
    hB, = plot([1,1],'b-')
    hR, = plot([1,1],'r-')
    legend((hB, hR),('Apples', 'Oranges'))
    hB.set_visible(False)
    hR.set_visible(False)
    
    savefig('boxcompare.png')
    show()
    

    grouped box plot