In [1]:
import prettyplotlib as ppl
import numpy as np
from scipy.stats import gaussian_kde
import brewer2mpl

set2 = brewer2mpl.get_map('Set2', 'qualitative', 8).mpl_colors

def violinplot(ax, x, ys, bp=False, cut=False, facecolor=set2[0],
               edgecolor=ppl.almost_black,
               alpha=0.3, bw_method=0.05, width=None):
    """Make a violin plot of each dataset in the `ys` sequence. `ys` is a
    list of numpy arrays.
    Adapted by: Olga Botvinnik
    # Original Author: Teemu Ikonen <tpikonen@gmail.com>
    # Based on code by Flavio Codeco Coelho,
    # http://pyinsci.blogspot.com/2009/09/violin-plot-with-matplotlib.html
    """
    dist = np.max(x) - np.min(x)
    if width is None:
        width = min(0.15 * max(dist, 1.0), 0.4)
    for i, (d, p) in enumerate(zip(ys, x)):
        k = gaussian_kde(d, bw_method=bw_method) #calculates the kernel density
        #         k.covariance_factor = 0.1
        s = 0.0
        if not cut:
            s = 1 * np.std(d) #FIXME: magic constant 1
        m = k.dataset.min() - s #lower bound of violin
        M = k.dataset.max() + s #upper bound of violin
        x = np.linspace(m, M, 100) # support for violin
        v = k.evaluate(x) #violin profile (density curve)
        v = width * v / v.max() #scaling the violin to the available space
        if isinstance(facecolor, list):
        #             for x0, v0, p0
            ax.fill_betweenx(x, -v + p,
                             v + p,
                             facecolor=facecolor[i],
                             alpha=alpha, edgecolor=edgecolor)
        else:
            ax.fill_betweenx(x, -v + p,
                             v + p,
                             facecolor=facecolor,
                             alpha=alpha, edgecolor=edgecolor)
    if bp:
        ax.boxplot(ys, notch=1, positions=x, vert=1)
    ppl.remove_chartjunk(ax, ['top', 'right'])
    return ax

In [4]:
[50:100::10]


  File "<ipython-input-4-9d824d02bf48>", line 1
    [50:100::10]
       ^
SyntaxError: invalid syntax

In [11]:
n = 5
x = range(n)
ys = [np.random.randn(np.random.choice(range(50, 110, 10)))+_ for _ in range(n)]

fig, ax = plt.subplots(1)
violinplot(ax, x, ys)


Out[11]:
<matplotlib.axes._subplots.AxesSubplot at 0x2aaaacb49fd0>

Change the bandwidth size (bigger = smoother) with bw_method (default bw_method=0.1, but you can specify any bw_method to http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.gaussian_kde.html#scipy.stats.gaussian_kde:

Parameters :
dataset : array_like Datapoints to estimate from. In case of univariate data this is a 1-D array, otherwise a 2-D array with shape (# of dims, # of data). bw_method : str, scalar or callable, optional The method used to calculate the estimator bandwidth. This can be ‘scott’, ‘silverman’, a scalar constant or a callable. If a scalar, this will be used directly as kde.factor. If a callable, it should take a gaussian_kde instance as only parameter and return a scalar. If None (default), ‘scott’ is used. See Notes for more details.


In [12]:
fig, ax = plt.subplots(1)
violinplot(ax, x, ys, bw_method=0.5)


Out[12]:
<matplotlib.axes._subplots.AxesSubplot at 0x2aaaacb58c10>

In [ ]: