2015-10-16 188 views
7

所以我使用seaborn做kdeplotsns.kdeplot(x, y, ax=plt.gca(), cmap="coolwarm")如何标签seaborn等高线图

我可以用levels kwarg改变水平,但我想能够标注轮廓。在matplotlib中,您只需执行plt.clabel(CS, CS.levels, inline=True),但seaborn不会返回轮廓集合CS

我该怎么做?或者我只需要从头开始自己做?

编辑:有没有办法让一个包装也将返回CS?我看不到如何...

+0

是的,你必须自己做,虽然一般的密度值不是特别有意义或有趣。 – mwaskom

+0

我试图让水平,所以我可以插入图例。但是因为它们没有特别的意义,所以我使用了一个自定义的KDE函数并且绘制了结果(根据您的建议)。谢谢 – Lucidnonsense

回答

5

不幸的是,seaborn做的一切都是为了让用户保持计数器的秘密。除了从数据中绘制一张plt.contour的图表,实际上并不太难,您可以让猴子修补seaborn _bivariate_kdeplot,然后让它返回以供进一步使用。

这可能如下所示:

import matplotlib.pyplot as plt 
import numpy as np; np.random.seed(10) 
import seaborn as sns 
import seaborn.distributions as sd 
from seaborn.palettes import color_palette, blend_palette 
from six import string_types 


def _bivariate_kdeplot(x, y, filled, fill_lowest, 
         kernel, bw, gridsize, cut, clip, 
         axlabel, cbar, cbar_ax, cbar_kws, ax, **kwargs): 
    """Plot a joint KDE estimate as a bivariate contour plot.""" 
    # Determine the clipping 
    if clip is None: 
     clip = [(-np.inf, np.inf), (-np.inf, np.inf)] 
    elif np.ndim(clip) == 1: 
     clip = [clip, clip] 

    # Calculate the KDE 
    if sd._has_statsmodels: 
     xx, yy, z = sd._statsmodels_bivariate_kde(x, y, bw, gridsize, cut, clip) 
    else: 
     xx, yy, z = sd._scipy_bivariate_kde(x, y, bw, gridsize, cut, clip) 

    # Plot the contours 
    n_levels = kwargs.pop("n_levels", 10) 
    cmap = kwargs.get("cmap", "BuGn" if filled else "BuGn_d") 
    if isinstance(cmap, string_types): 
     if cmap.endswith("_d"): 
      pal = ["#333333"] 
      pal.extend(color_palette(cmap.replace("_d", "_r"), 2)) 
      cmap = blend_palette(pal, as_cmap=True) 
     else: 
      cmap = plt.cm.get_cmap(cmap) 

    kwargs["cmap"] = cmap 
    contour_func = ax.contourf if filled else ax.contour 
    cset = contour_func(xx, yy, z, n_levels, **kwargs) 
    if filled and not fill_lowest: 
     cset.collections[0].set_alpha(0) 
    kwargs["n_levels"] = n_levels 

    if cbar: 
     cbar_kws = {} if cbar_kws is None else cbar_kws 
     ax.figure.colorbar(cset, cbar_ax, ax, **cbar_kws) 

    # Label the axes 
    if hasattr(x, "name") and axlabel: 
     ax.set_xlabel(x.name) 
    if hasattr(y, "name") and axlabel: 
     ax.set_ylabel(y.name) 

    return ax, cset 

# monkey patching 
sd._bivariate_kdeplot = _bivariate_kdeplot 

# some data 
mean, cov = [0, 2], [(1, .5), (.5, 1)] 
x, y = np.random.multivariate_normal(mean, cov, size=50).T 

# plot 
fig, ax = plt.subplots() 
_, cs = sns.kdeplot(x, y, ax=ax, cmap="coolwarm") 
# label the contours 
plt.clabel(cs, cs.levels, inline=True) 
# add a colorbar 
fig.colorbar(cs) 

plt.show() 

enter image description here

+0

对!此修补程序还允许将轮廓填充,线条和标签的显示进行轻微更改。 Colorbar在将seaborn更新为v0.8.1后工作。 – bejota