def plot_contours(f, x, samples, ax=None, **kwargs):
    r"""
    Plot the probability mass function given `x` at a range of :math:`y` values
    for :math:`y = f(x|\theta)`

    :math:`P(y|x) = \int P(y=f(x;\theta)|x,\theta) P(\theta) d\theta`

    :math:`\mathrm{pmf}(y|x) = \int_{P(y'|x) < P(y|x)} P(y'|x) dy'`

    Additionally, if a list of log-evidences are passed, along with list of
    functions, and list of samples, this function plots the probability mass
    function for all models marginalised according to the evidences.

    Parameters
    ----------
    f: function
        function :math:`f(x;\theta)` (or list of functions for each model) with
        dependent variable :math:`x`, parameterised by :math:`\theta`.

    x: 1D array-like
        `x` values to evaluate :math:`f(x;\theta)` at.

    samples: 2D array-like
        :math:`\theta` samples (or list of :math:`\theta` samples) to evaluate
        :math:`f(x;\theta)` at.
        `shape = (nsamples, npars)`

    ax: axes object, optional
        :class:`matplotlib.axes._subplots.AxesSubplot` to plot the contours
        onto. If unsupplied, then :func:`matplotlib.pyplot.gca()` is used to
        get the last axis used, or create a new one.

    logZ: 1D array-like, optional
        log-evidences of each model if multiple models are passed.
        Should be same length as the list `f`, and need not be normalised.
        Default: `numpy.ones_like(f)`

    weights: 1D array-like, optional
        sample weights (or list of weights), if desired. Should have length
        same as `samples.shape[0]`.
        Default: `numpy.ones_like(samples)`

    ny: int, optional
        Resolution of `y` axis.
        Default: `100`

    y: array-like, optional
        Explicit descriptor of `y` values to evaluate.
        Default: `numpy.linspace(min(f), max(f), ny)`

    ntrim: int, optional
        Approximate number of samples to trim down to, if desired. Useful if
        the posterior is dramatically oversampled.
        Default: None

    cache: str, optional
        File root for saving previous calculations for re-use

    parallel, tqdm_args:
        see docstring for :func:`fgivenx.parallel.parallel_apply`

    kwargs: further keyword arguments
        Any further keyword arguments are plotting keywords that are passed to
        :func:`fgivenx.plot.plot`.

    Returns
    -------
    cbar: color bar
        :class:`matplotlib.contour.QuadContourSet`
        Colors to create a global colour bar
    """
    logZ = kwargs.pop('logZ', None)
    weights = kwargs.pop('weights', None)
    ntrim = kwargs.pop('ntrim', None)
    ny = kwargs.pop('ny', 100)
    y = kwargs.pop('y', None)
    cache = kwargs.pop('cache', '')
    parallel = kwargs.pop('parallel', False)
    tqdm_kwargs = kwargs.pop('tqdm_kwargs', {})

    y, pmf = compute_pmf(f, x, samples, weights=weights, logZ=logZ,
                         ntrim=ntrim, ny=ny, y=y,
                         parallel=parallel, cache=cache,
                         tqdm_kwargs=tqdm_kwargs)
    cbar = fgivenx.plot.plot(x, y, pmf, ax, **kwargs)
    return cbar
def plot_contours ( f , x , samples , ax = None , ** kwargs ) : logZ = kwargs . pop ( 'logZ' , None ) weights = kwargs . pop ( 'weights' , None ) ntrim = kwargs . pop ( 'ntrim' , None ) ny = kwargs . pop ( 'ny' , 100 ) y = kwargs . pop ( 'y' , None ) cache = kwargs . pop ( 'cache' , '' ) parallel = kwargs . pop ( 'parallel' , False ) tqdm_kwargs = kwargs . pop ( 'tqdm_kwargs' , { } ) y , pmf = compute_pmf ( f , x , samples , weights = weights , logZ = logZ , ntrim = ntrim , ny = ny , y = y , parallel = parallel , cache = cache , tqdm_kwargs = tqdm_kwargs ) cbar = fgivenx . plot . plot ( x , y , pmf , ax , ** kwargs ) return cbar
r"""
    Plot the probability mass function given `x` at a range of :math:`y` values
    for :math:`y = f(x|\theta)`

    :math:`P(y|x) = \int P(y=f(x;\theta)|x,\theta) P(\theta) d\theta`

    :math:`\mathrm{pmf}(y|x) = \int_{P(y'|x) < P(y|x)} P(y'|x) dy'`

    Additionally, if a list of log-evidences are passed, along with list of
    functions, and list of samples, this function plots the probability mass
    function for all models marginalised according to the evidences.

    Parameters
    ----------
    f: function
        function :math:`f(x;\theta)` (or list of functions for each model) with
        dependent variable :math:`x`, parameterised by :math:`\theta`.

    x: 1D array-like
        `x` values to evaluate :math:`f(x;\theta)` at.

    samples: 2D array-like
        :math:`\theta` samples (or list of :math:`\theta` samples) to evaluate
        :math:`f(x;\theta)` at.
        `shape = (nsamples, npars)`

    ax: axes object, optional
        :class:`matplotlib.axes._subplots.AxesSubplot` to plot the contours
        onto. If unsupplied, then :func:`matplotlib.pyplot.gca()` is used to
        get the last axis used, or create a new one.

    logZ: 1D array-like, optional
        log-evidences of each model if multiple models are passed.
        Should be same length as the list `f`, and need not be normalised.
        Default: `numpy.ones_like(f)`

    weights: 1D array-like, optional
        sample weights (or list of weights), if desired. Should have length
        same as `samples.shape[0]`.
        Default: `numpy.ones_like(samples)`

    ny: int, optional
        Resolution of `y` axis.
        Default: `100`

    y: array-like, optional
        Explicit descriptor of `y` values to evaluate.
        Default: `numpy.linspace(min(f), max(f), ny)`

    ntrim: int, optional
        Approximate number of samples to trim down to, if desired. Useful if
        the posterior is dramatically oversampled.
        Default: None

    cache: str, optional
        File root for saving previous calculations for re-use

    parallel, tqdm_args:
        see docstring for :func:`fgivenx.parallel.parallel_apply`

    kwargs: further keyword arguments
        Any further keyword arguments are plotting keywords that are passed to
        :func:`fgivenx.plot.plot`.

    Returns
    -------
    cbar: color bar
        :class:`matplotlib.contour.QuadContourSet`
        Colors to create a global colour bar