seaborn pairgrid:使用2个色调的kdeplot

eca*_*asa 10 python plot seaborn

这是我努力绘制一个双网格图,使用下部的kdeplot和2个色调:

在此输入图像描述

我的脚本是:

import seaborn as sns
g = sns.PairGrid(df2,hue='models')  
g.map_upper(plt.scatter)
g.map_lower(sns.kdeplot)
g.map_diag(sns.distplot)
Run Code Online (Sandbox Code Playgroud)

在seaborn 0.6.0中是否有办法根据色调在map_lower的kdeplot中使用更多的色阶?

在这种情况下,hue只有2个值.也许我错过了一些明显的东西.

小智 6

你需要创建一个由PairGrid调用的绘图函数,格式为myplot(x,y,**kws).kws包含由PairGrid自动创建的字段'color'或由您在PairGrid的Palette参数中给出的字段'color'.

要控制从Palette中给出的颜色中选择颜色图的方法,最好使用字典手动设置此参数,该字典将传递给hue的变量的变量值与您选择的颜色相关联.

这里只有4种颜色的例子:红色,绿色,蓝色和洋红色.导致彩色地图:红色,绿色,蓝调和紫色.

从颜色中推断cmap

def infer_cmap(color):  
    if color == (0., 0., 1.):
        return 'Blues'
    elif color == (0., 0.5, 0.):
        return 'Greens'
    elif color == (1., 0., 0.):
        return 'Reds'
    elif color == (0.75, 0., 0.75):
        return 'Purples'
Run Code Online (Sandbox Code Playgroud)

将色调添加到kde图中

def kde_hue(x, y, **kws):
    ax = plt.gca()
    cmap = infer_cmap(kws['color'])
    sns.kdeplot(data=x, data2=y, ax=ax, shade=True, shade_lowest=False, cmap=cmap, **kws)
    return ax
Run Code Online (Sandbox Code Playgroud)

创建PairGrid

colors = ['b', 'g', 'r', 'm']
var = 'models'

color_dict = {}
for idx, v in enumerate(np.unique(df2[var])):
    color_dict[v] = colors[idx]
g = sns.PairGrid(df2, hue=var, palette=color_dict)
g = g.map_diag(sns.kdeplot)
g = g.map_upper(plt.scatter)
g = g.map_lower(kde_hue)
g = g.add_legend()
plt.show()
plt.close()
Run Code Online (Sandbox Code Playgroud)


kid*_*ixo 5

我认为hue_kwds在PairGrid 中使用它是很容易的.我在这里找到了一个很好的解释在数据感知网格上绘图,因为PairGrid中的doc对我来说不够清晰.

您还可以让情节的其他方面在色调变量的各个级别之间变化,这有助于制作在以黑白方式打印时更易于理解的情节.为此,将字典传递给hue_kws,其中键是绘图函数关键字参数的名称,值是关键字值列表,每个级别为一个色调变量.

基本上,hue_kws是一个列表的字典.关键字将通过列表中的值传递给单个绘图函数,每个级别用于hue变量的每个级别.请参阅下面的代码示例.

我在分析中使用数字列作为色调,但它也应该在这里工作.如果没有,您可以轻松地将'models'的每个唯一值映射到整数.

马丁佩雷斯的好回答中窃取我会做的事情:

编辑:完整的代码示例

编辑2:我发现kdeplot不适合数字标签.相应地更改代码.

# generate data: sorry, I'm lazy and sklearn make it easy.
n = 1000
from sklearn.datasets.samples_generator import make_blobs
X, y = make_blobs(n_samples=n, centers=3, n_features=3,random_state=0)

df2 = pd.DataFrame(data=np.hstack([X,y[np.newaxis].T]),columns=['X','Y','Z','model'])
# distplot has a problem witht the color being a number!!!
df2['model'] = df2['model'].map('model_{}'.format)

list_of_cmaps=['Blues','Greens','Reds','Purples']
g = sns.PairGrid(df2,hue='model',
      # this is only if you use numerical hue col
#     vars=[i for i in df2.columns if 'm' not in i], 
    # the first hue value vill get cmap='Blues'
    # the first hue value vill get cmap='Greens'
    # and so on
    hue_kws={"cmap":list_of_cmaps},
    )
g.map_upper(plt.scatter)
g.map_lower(sns.kdeplot,shade=True, shade_lowest=False)
g.map_diag(sns.distplot)
# g.map_diag(plt.hist)
g.add_legend()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

排序list_of_cmaps您应该能够为特定级别的分类变量指定特定的阴影.

升级将list_of_cmaps根据您需要的级别动态创建.