python matplotlib filled boxplots

24,204

Solution 1

The example that @Fenikso shows an example of doing this, but it actually does it in a sub-optimal way.

Basically, you want to pass patch_artist=True to boxplot.

As a quick example:

import matplotlib.pyplot as plt
import numpy as np

data = [np.random.normal(0, std, 1000) for std in range(1, 6)]
plt.boxplot(data, notch=True, patch_artist=True)

plt.show()

enter image description here

If you'd like to control the color, do something similar to this:

import matplotlib.pyplot as plt
import numpy as np

data = [np.random.normal(0, std, 1000) for std in range(1, 6)]

box = plt.boxplot(data, notch=True, patch_artist=True)

colors = ['cyan', 'lightblue', 'lightgreen', 'tan', 'pink']
for patch, color in zip(box['boxes'], colors):
    patch.set_facecolor(color)

plt.show()

enter image description here

Solution 2

You can do this with the Plotly Python API. The graph, script, and data for this graph are here.

To control color, you'll want to stipulate a fillcolor. Here, it's not set; the default is to fill it. Or, you can make it transparent, by adding 'fillcolor':'rgba(255, 255, 255, 0)'. You could also style with the GUI to tweak it.

import plotly
py = plotly.plotly(username='username', key='api_key')

from numpy.random import lognormal

x=[0]*1000+[1]*1000+[2]*1000
y=lognormal(0,1,1000).tolist()+lognormal(0,2,1000).tolist()+lognormal(0,3,1000).tolist()
s={'type':'box','jitter':0.5}
l={'title': 'Fun with the Lognormal distribution','yaxis':{'type':'log'}}

py.plot(x,y,style=s,layout=l)

Full disclosure: I'm on the Plotly team.

Boxplot

Share:
24,204
MHardy
Author by

MHardy

Updated on July 09, 2022

Comments

  • MHardy
    MHardy almost 2 years

    Does anyone know if we can plot filled boxplots in python matplotlib? I've checked http://matplotlib.org/api/pyplot_api.html but I couldn't find useful information about that.

  • n1000
    n1000 over 9 years
    Add patch.set_alpha(0.5) to the loop for transparency.
  • Joe Kington
    Joe Kington over 9 years
    @n1000 - Note that you can combine calls to "set_<blah>" by using the set method. For example: patch.set(facecolor=color, alpha=0.5).
  • Arne Babenhauserheide
    Arne Babenhauserheide almost 9 years
    This is great - thank you! I had searched for a clean way to do this for hours.
  • Arne Babenhauserheide
    Arne Babenhauserheide almost 9 years
    what is the advantage of using a webservice-reliant online-system where I have to log in before I can plot? (I thought I’d ask before I vote down as this-is-not-matplotlib)
  • Mateo Sanchez
    Mateo Sanchez almost 9 years
    Thanks Arne. The benefits people usually like are sharing, interactivity, collaboration, and the ability to embed. See an IPython tutorial here for more.
  • Arne Babenhauserheide
    Arne Babenhauserheide almost 9 years
    is it possible to use this without the webservice? (offline)
  • Mateo Sanchez
    Mateo Sanchez over 8 years
    @ArneBabenhauserheide, yes. Here's where to download.
  • Ger
    Ger over 8 years
    Is it possible to set transparency to the facecolor but not to the line of the box ?