def _statsmodels_bivariate_kde(x, y, bw, gridsize, cut, clip): """Compute a bivariate kde using statsmodels.""" # statsmodels 0.8 fails on int type data x = x.astype(np.float64) y = y.astype(np.float64) if isinstance(bw, str): bw_func = getattr(smnp.bandwidths, "bw_" + bw) x_bw = bw_func(x) y_bw = bw_func(y) bw = [x_bw, y_bw] elif np.isscalar(bw): bw = [bw, bw] if isinstance(x, pd.Series): x = x.values if isinstance(y, pd.Series): y = y.values kde = smnp.KDEMultivariate([x, y], "cc", bw) x_support = _kde_support(x, kde.bw[0], gridsize, cut, clip[0]) y_support = _kde_support(y, kde.bw[1], gridsize, cut, clip[1]) xx, yy = np.meshgrid(x_support, y_support) z = kde.pdf([xx.ravel(), yy.ravel()]).reshape(xx.shape) return xx, yy, z
def _statsmodels_bivariate_kde(x, y, bw='scott', gridsize=100, cut=3, clip=[(-np.inf, np.inf), (-np.inf, np.inf)]): """Compute a bivariate kde using statsmodels.""" if isinstance(bw, string_types): bw_func = getattr(smnp.bandwidths, "bw_" + bw) x_bw = bw_func(x) y_bw = bw_func(y) bw = [x_bw, y_bw] elif np.isscalar(bw): bw = [bw, bw] if isinstance(x, pd.Series): x = x.values if isinstance(y, pd.Series): y = y.values kde = smnp.KDEMultivariate([x, y], "cc", bw) x_support = _kde_support(x, kde.bw[0], gridsize, cut, clip[0]) y_support = _kde_support(y, kde.bw[1], gridsize, cut, clip[1]) xx, yy = np.meshgrid(x_support, y_support) z = kde.pdf([xx.ravel(), yy.ravel()]).reshape(xx.shape) return xx, yy, z
def hacked_statsmodels_bivariate_kde(x, y, bw, gridsize, cut, clip): """Compute a bivariate kde using statsmodels. Modified to give the exponentiated values on the y axis""" import statsmodels.nonparametric.api as smnp from seaborn.utils import _kde_support if isinstance(bw, str): bw_func = getattr(smnp.bandwidths, "bw_" + bw) x_bw = bw_func(x) y_bw = bw_func(y) bw = [x_bw, y_bw] elif np.isscalar(bw): bw = [bw, bw] if isinstance(x, pd.Series): x = x.values if isinstance(y, pd.Series): y = y.values kde = smnp.KDEMultivariate([x, y], "cc", bw) x_support = _kde_support(x, kde.bw[0], gridsize, cut, clip[0]) y_support = _kde_support(y, kde.bw[1], gridsize, cut, clip[1]) xx, yy = np.meshgrid(x_support, y_support) z = kde.pdf([xx.ravel(), yy.ravel()]).reshape(xx.shape) # exponentiate y values return xx, np.exp(yy), z
def _bivariate_kdeplot(x, y, xscale=None, yscale=None, shade=False, kernel="gau", bw="scott", gridsize=100, cut=3, clip=None, legend=True, **kwargs): ax = plt.gca() # Determine the clipping clip = [(-np.inf, np.inf), (-np.inf, np.inf)] x = xscale(x) y = yscale(y) # Compute a bivariate kde using statsmodels. if isinstance(bw, string_types): bw_func = getattr(smnp.bandwidths, "bw_" + bw) x_bw = bw_func(x) y_bw = bw_func(y) bw = [x_bw, y_bw] elif np.isscalar(bw): bw = [bw, bw] kde = smnp.KDEMultivariate([x, y], "cc", bw) x_support = _kde_support(x, kde.bw[0], gridsize, cut, clip[0]) y_support = _kde_support(y, kde.bw[1], gridsize, cut, clip[1]) xx, yy = np.meshgrid(x_support, y_support) z = kde.pdf([xx.ravel(), yy.ravel()]).values.reshape(xx.shape) n_levels = kwargs.pop("n_levels", 10) color = kwargs.pop("color") kwargs['colors'] = (color, ) x_support = xscale.inverse(x_support) y_support = yscale.inverse(y_support) xx, yy = np.meshgrid(x_support, y_support) contour_func = ax.contourf if shade else ax.contour cset = contour_func(xx, yy, z, n_levels, **kwargs) num_collections = len(cset.collections) min_alpha = kwargs.pop("min_alpha", 0.2) if shade: min_alpha = 0 max_alpha = kwargs.pop("max_alpha", 0.9) alpha = np.linspace(min_alpha, max_alpha, num=num_collections) for el in range(num_collections): cset.collections[el].set_alpha(alpha[el]) # Label the axes if hasattr(x, "name") and legend: ax.set_xlabel(x.name) if hasattr(y, "name") and legend: ax.set_ylabel(y.name) return ax