2015-10-16 14 views
7

シーボーンを使用してkdeplotsns.kdeplot(x, y, ax=plt.gca(), cmap="coolwarm")にします。シーボーンコンタープロットにラベルを付ける方法

私はlevels kwargでレベルを変更できますが、輪郭にラベルを付けることもできます。 matplotlibではplt.clabel(CS, CS.levels, inline=True)を実行しますが、海軍は輪郭コレクションCSを返しません。

どうすればよいですか?それとも自分で一からすべてをやらなければならないのですか?

編集:おそらくCSを返すラッパーを作る方法はありますか?しかし、私はどのように見ることができません...

+0

を一般的に密度の値は特に意味のか面白くないですがはい、あなたは、それを自分で行う必要があるでしょう。 – mwaskom

+0

レベルを取得しようとしていたので、凡例を挿入できました。しかし、特に意味があるわけではないので、私はカスタムのKDE関数を使用して、代わりに結果をプロットしました(あなたのアドバイスで)。ありがとう – Lucidnonsense

答えて

5

残念ながら、海兵隊員はユーザーから秘密を守るためにすべてを行います。実際にはあまりにも難しくないデータからplt.contourのプロットを描くこととは別に、海軍の_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

関連する問題