def kde_plot_1d(ax, data, *args, **kwargs): """Plot a 1d marginalised distribution. This functions as a wrapper around matplotlib.axes.Axes.plot, with a kernel density estimation computation provided by scipy.stats.gaussian_kde in between. All remaining keyword arguments are passed onwards. Parameters ---------- ax: matplotlib.axes.Axes axis object to plot on. data: numpy.array Samples to generate kernel density estimator. weights: numpy.array, optional Sample weights. ncompress: int, optional Degree of compression. Default 1000 xmin, xmax: float lower/upper prior bound. optional, default None Returns ------- lines: matplotlib.lines.Line2D A list of line objects representing the plotted data (same as matplotlib matplotlib.axes.Axes.plot command) """ if len(data) == 0: return numpy.zeros(0), numpy.zeros(0) if data.max() - data.min() <= 0: return xmin = kwargs.pop('xmin', None) xmax = kwargs.pop('xmax', None) weights = kwargs.pop('weights', None) ncompress = kwargs.pop('ncompress', 1000) x, w = sample_compression_1d(data, weights, ncompress) kde = gaussian_kde(x, weights=w) p = kde(x) p /= p.max() i = ((x < quantile(x, 0.999, w)) & (x > quantile(x, 0.001, w))) | (p > 0.1) if xmin is not None: i = i & (x > xmin) if xmax is not None: i = i & (x < xmax) sigma = numpy.sqrt(kde.covariance[0, 0]) pp = cut_and_normalise_gaussian(x[i], p[i], sigma, xmin, xmax) pp /= pp.max() ans = ax.plot(x[i], pp, *args, **kwargs) ax.set_xlim(*check_bounds(x[i], xmin, xmax), auto=True) return ans
def test_sample_compression_1d(): np.random.seed(0) N = 10000 x_ = np.random.rand(N) w_ = np.random.rand(N) n = 1000 x, w = sample_compression_1d(x_, w_, n) assert len(x) == n assert len(w) == n assert np.isclose(w.sum(), w_.sum())
def kde_plot_1d(ax, data, *args, **kwargs): """Plot a 1d marginalised distribution. This functions as a wrapper around matplotlib.axes.Axes.plot, with a kernel density estimation computation provided by scipy.stats.gaussian_kde in between. All remaining keyword arguments are passed onwards. Parameters ---------- ax: matplotlib.axes.Axes axis object to plot on. data: np.array Samples to generate kernel density estimator. weights: np.array, optional Sample weights. ncompress: int, optional Degree of compression. Default 1000 xmin, xmax: float lower/upper prior bound. optional, default None levels: list values at which to draw iso-probability lines. optional, default [0.95, 0.68] facecolor: bool or string If set to True then the 1d plot will be shaded with the value of the ``color`` kwarg. Set to a string such as 'blue', 'k', 'r', 'C1' ect. to define the color of the shading directly. optional, default False Returns ------- lines: matplotlib.lines.Line2D A list of line objects representing the plotted data (same as matplotlib matplotlib.axes.Axes.plot command) """ if len(data) == 0: return np.zeros(0), np.zeros(0) if data.max()-data.min() <= 0: return kwargs = normalize_kwargs( kwargs, dict(linewidth=['lw'], linestyle=['ls'], color=['c'], facecolor=['fc'], edgecolor=['ec'])) levels = kwargs.pop('levels', [0.95, 0.68]) xmin = kwargs.pop('xmin', None) xmax = kwargs.pop('xmax', None) weights = kwargs.pop('weights', None) ncompress = kwargs.pop('ncompress', 1000) density = kwargs.pop('density', False) cmap = kwargs.pop('cmap', None) color = kwargs.pop('color', (next(ax._get_lines.prop_cycler)['color'] if cmap is None else cmap(0.68))) facecolor = kwargs.pop('facecolor', False) if 'edgecolor' in kwargs: edgecolor = kwargs.pop('edgecolor') if edgecolor: color = edgecolor else: edgecolor = color q = kwargs.pop('q', '5sigma') q = quantile_plot_interval(q=q) if weights is not None: data = data[weights != 0] weights = weights[weights != 0] x, w = sample_compression_1d(data, weights, ncompress) kde = gaussian_kde(x, weights=w) p = kde(x) p /= p.max() i = ((x > quantile(x, q[0], w)) & (x < quantile(x, q[1], w))) if xmin is not None: i = i & (x > xmin) if xmax is not None: i = i & (x < xmax) sigma = np.sqrt(kde.covariance[0, 0]) pp = cut_and_normalise_gaussian(x[i], p[i], sigma, xmin, xmax) pp /= pp.max() area = np.trapz(x=x[i], y=pp) if density else 1 ans = ax.plot(x[i], pp/area, color=color, *args, **kwargs) ax.set_xlim(*check_bounds(x[i], xmin, xmax), auto=True) if facecolor and facecolor not in [None, 'None', 'none']: if facecolor is True: facecolor = color c = iso_probability_contours_from_samples(pp, contours=levels, weights=w) cmap = basic_cmap(facecolor) fill = [] for j in range(len(c)-1): fill.append(ax.fill_between(x[i], pp, where=pp >= c[j], color=cmap(c[j]), edgecolor=edgecolor)) return ans, fill return ans
def kde_plot_1d(ax, data, *args, **kwargs): """Plot a 1d marginalised distribution. This functions as a wrapper around matplotlib.axes.Axes.plot, with a kernel density estimation computation provided by scipy.stats.gaussian_kde in between. All remaining keyword arguments are passed onwards. Parameters ---------- ax: matplotlib.axes.Axes axis object to plot on. data: np.array Samples to generate kernel density estimator. weights: np.array, optional Sample weights. ncompress: int, optional Degree of compression. Default 1000 xmin, xmax: float lower/upper prior bound. optional, default None Returns ------- lines: matplotlib.lines.Line2D A list of line objects representing the plotted data (same as matplotlib matplotlib.axes.Axes.plot command) """ if len(data) == 0: return np.zeros(0), np.zeros(0) if data.max() - data.min() <= 0: return kwargs = normalize_kwargs(kwargs, dict(linewidth=['lw'], linestyle=['ls'], color=['c']), drop=['fc', 'ec']) xmin = kwargs.pop('xmin', None) xmax = kwargs.pop('xmax', None) weights = kwargs.pop('weights', None) ncompress = kwargs.pop('ncompress', 1000) cmap = kwargs.pop('cmap', None) color = kwargs.pop('color', (next(ax._get_lines.prop_cycler)['color'] if cmap is None else cmap(0.68))) q = kwargs.pop('q', '5sigma') q = quantile_plot_interval(q=q) if weights is not None: data = data[weights != 0] weights = weights[weights != 0] x, w = sample_compression_1d(data, weights, ncompress) kde = gaussian_kde(x, weights=w) p = kde(x) p /= p.max() i = ((x > quantile(x, q[0], w)) & (x < quantile(x, q[1], w))) if xmin is not None: i = i & (x > xmin) if xmax is not None: i = i & (x < xmax) sigma = np.sqrt(kde.covariance[0, 0]) pp = cut_and_normalise_gaussian(x[i], p[i], sigma, xmin, xmax) pp /= pp.max() ans = ax.plot(x[i], pp, color=color, *args, **kwargs) ax.set_xlim(*check_bounds(x[i], xmin, xmax), auto=True) return ans