【问题标题】:seaborn pairgrid: using kdeplot with 2 huesseaborn pairgrid:使用具有 2 种色调的 kdeplot
【发布时间】:2015-10-01 14:02:42
【问题描述】:

这是我绘制的 pairgrid 图,它使用下部的 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)

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

在这种情况下,色调只有 2 个值。也许我遗漏了一些明显的东西。

【问题讨论】:

  • 您需要为kdeplot 制作一个小包装函数,以便它理解双变量图上下文中的“颜色”参数并使用它来选择合适的颜色图,例如使用sns.dark_palette。稍后我有时间会做一个例子,但这可能会有所帮助。

标签: python plot seaborn


【解决方案1】:

我认为在 PairGrid 中使用 hue_kwds 要容易得多。 我在这里找到了一个很好的解释 Plotting on data-aware grids,因为 PairGrid 中的文档对我来说不够清楚。

你也可以让情节的其他方面在不同的层次上有所不同 色调变量,这有助于制作更丰富的图 黑白打印时可以理解。为此,请通过 字典到 hue_kws 其中键是绘图函数的名称 关键字参数和值是关键字值的列表,每个关键字值一个 色调变量的级别。

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

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

Martin Perez 的好答案中窃取我会做类似的事情:

编辑:完整的代码示例

EDIT 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()

排序list_of_cmaps 您应该能够将特定的阴影分配给分类变量的特定级别。

升级是根据您需要的级别数动态创建list_of_cmaps

【讨论】:

    【解决方案2】:

    您需要创建自己的由 PairGrid 调用的绘图函数,其形式为 myplot(x, y, **kws)。 kws 包含由 PairGrid 自动创建或由您在 PairGrid 的 Palette 参数中提供的字段“颜色”。

    要控制如何从 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'
    

    为 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
    

    创建 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()
    

    【讨论】:

      【解决方案3】:

      我在尝试在 kdeplot()distplot() 上使用 hue 时遇到了这个问题,这不是受支持的参数。这行得通

      g = sns.FacetGrid(df_rtn, hue="group")
      g = g.map(sns.kdeplot, "variable")
      # or
      g = g.map(sns.distplot, "variable")
      

      【讨论】:

        【解决方案4】:

        从 Martin 的示例中可以看出,需要创建一个包装函数来指示 sns.kdeplot 使用什么颜色映射。这是一个类似的例子,应该更容易理解:

        # We will use seaborn 'Set1' color pallet
        
        >>> print(sns.color_palette('Set1'))
        
        [(0.89411765336990356, 0.10196078568696976, 0.10980392247438431),
         (0.21602460800432691, 0.49487120380588606, 0.71987698697576341),
         (0.30426760128900115, 0.68329106055054012, 0.29293349969620797),
         (0.60083047361934883, 0.30814303335021526, 0.63169552298153153),
         (1.0, 0.50591311045721465, 0.0031372549487095253),
         (0.99315647868549117, 0.9870049982678657, 0.19915417450315812)]
        

        颜色图采用基于托盘的颜色。默认托盘是绿色 - (0., 0., 1.) 和蓝色 - (0., 0.5, 0.)。但是,我们使用的是上面的具有不同 RBG 元组的托盘。

        def infer_cmap(color):
            hues = sns.color_palette('Set1')
            if color == hues[0]:
                return 'Reds'
            elif color == hues[1]:
                return 'Blues'
        
        def kde_color_plot(x, y, **kwargs):
            cmap = infer_cmap(kwargs['color'])
            ax = sns.kdeplot(x, y, shade=True, shade_lowest=False, cmap=cmap, **kwargs)
            return ax
        
        g = sns.PairGrid(df, hue='left', vars=['satisfaction_level', 'last_evaluation'], palette='Set1')
        g = g.map_upper(plt.scatter, s=1, alpha=0.5)
        g = g.map_lower(kde_color_plot)
        g = g.map_diag(sns.kdeplot, shade=True);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-20
          • 1970-01-01
          • 2022-01-20
          • 2021-02-04
          • 1970-01-01
          相关资源
          最近更新 更多