def comparedist(df, *args, **kwargs):
    """
    Compare the distributions of two DataFrames giving visualisations of:
     - individual and combined distributions
     - distribution of non-common values
     - distribution of non-common values vs. each side

    Plot distribution as area (fill_between) + mean, median vertical bars.

    :param df1: `pandas.DataFrame`
    :param arg0: the base dataframe *selector* to perform calculation against.
    :param *: a number of `pandas.DataFrames` selectors to compare to arg0
    :param bins: `int` number of bins for histogram
    :param xlabel: label for X axis
    :param ylabel: label for Y axis
    :param base_fmt: Text format to use for base selector legend. Python .format() syntax.
    :param arg_fmt: Text format to use for format, with selectors legend. Python .format() syntax.
    :return: Figure
    """

    bins = kwargs.get('bins', 50)
    xlabel = kwargs.get('xlabel', 'Value')
    ylabel = kwargs.get('ylabel', 'Count')
    base_fmt = kwargs.get('base_fmt')
    arg_fmt = kwargs.get('arg_fmt')

    # The base for comparisons is the first passed selector.
    base_selector, selectors = args[0], args[1:]
    df1 = df[base_selector]

    fig, axes = plt.subplots(len(selectors), 1, figsize=(10, len(selectors) * 5))

    if not isinstance(axes, np.ndarray):
        axes = [axes]  # mpl returns a single object when only one.

    for n, (ax1, selector) in enumerate(zip(axes, selectors)):

        dfn = df[selector]

        xr = np.nanmin( [np.nanmin(df1), np.nanmin(dfn)] ), np.nanmax( [np.nanmax(df1), np.nanmax(dfn)] )

        ax1.set_title('Distributions of %s and %s' % (base_selector, selector))
        _areadist(ax1, dfn.values, xr, c='r', bins=bins, label=format_label(base_selector, base_fmt))
        _areadist(ax1, df1.values, xr, c='k', bins=bins, alpha=0.3, label=format_label(selector, arg_fmt))

        ax1.set_xlabel(xlabel)
        ax1.set_ylabel(ylabel)
        _, ymax = ax1.get_ylim()
        ax1.set_ylim(0, ymax)

        ax1.legend(loc='upper right')

    fig.tight_layout()
    return fig