matplotlib: Group boxplots

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

Leave a Comment