pandas Seaborn pairplots with continuous hues?

jdgnovmf  于 2023-05-12  发布在  其他
关注(0)|答案(4)|浏览(95)

我怎样才能把连续色调引入到我的海运配对图中?
我传入一个pandas数据框train_df,以便可视化多个特征之间的关系。
但是我也想添加一个色调,它将使用相应的目标值target_df。这些目标值是连续标度(~在10和100之间浮动)。
我已经定义了一个我想使用的sns.color_palette("RdGr")
现在我有以下pairplot(没有色调):

sns.pairplot(train_df)

如何使用上面定义的调色板将target_df作为色调传递?
非常感谢。

frebpwbc

frebpwbc1#

pairplot(也就是底层的PairGrid)现在将hue委托给Map函数(如果它支持的话)。你可能不想为每个价格绘制一个不同的边际密度,但是:

diamonds = sns.load_dataset("diamonds")
sns.pairplot(
    diamonds,
    hue="price", vars=["carat", "depth", "table"], 
    diag_kws=dict(color=".2", hue=None)
)

旧答案,用于演示PairGrid的更灵活使用:
这可能比现在更容易,但没有必要自己重新创建PairGrid

diamonds = sns.load_dataset("diamonds")
g = sns.PairGrid(diamonds, vars=["carat", "depth", "table"])
g.map_diag(sns.kdeplot, color=".2")
g.map_offdiag(sns.scatterplot, hue=diamonds["price"], s=5, linewidth=0)
g.axes[1, -1].legend(loc="center left", bbox_to_anchor=(.7, .5))

rxztt3cl

rxztt3cl2#

您可以将target_df指定为train_df中的一列,并将其作为hue传递:

sns.pairplot(data=train_df.assign(target=target_df, 
                                  hue='target')

但是,如果您的target是连续的,这将非常慢。相反,你可以执行一个双for循环:

num_features = len(train_df.columns)
fig,ax = plt.subplots(num_features, num_features, figsize=(10,10))
for i in train_df.columns:
    for j in train_df.columns:
        if i==j:    # diagonal
            sns.distplot(train_df[0], kde=False, ax=ax[i][j])
        else:       # off diagonal
            sns.scatterplot(x=train_df[i],y=train_df[j], 
                            ax=ax[i][j], hue=target_df, palette='BrBG',
                            legend=False)

它给你这样的东西:

ymdaylpp

ymdaylpp3#

我的声望太低了,不能发表评论,所以我必须提供一个单独的答案。我在两个方面修改了选择的答案(Quang Hoang)。
首先,如果列的名称不是与子图网格对应的整数,那么您需要区分传递给train_df[i]的列的索引(这里是ij)和传递给ax=ax[i,j]的子图的索引。
其次,seaborn的distplot已被弃用,因此将其切换到histplot

num_feats = len(train_df.columns)
fig, ax = plt.subplots(num_feats, num_feats, figsize=(10,10))

# In order to assign the plots to the correct axes,
# create a dictionary to refer the column names to integers.
col_dict = dict(zip(train_df.columns, range(len(train_df.columns))))

for col_i in train_df.columns:
    i = col_dict[col_i]
    for col_j in train_df.columns:
        j = col_dict[col_j]
        if col_i==col_j:
            sns.histplot(train_df[col_i], kde=False, ax=ax[i,j])
        else:
            sns.scatterplot(x=train_df[col_i], y=train_df[col_j], ax=ax[i,j], hue=target_df, legend=False)

fig.tight_layout()  # make room for subplot labels
waxmsbnn

waxmsbnn4#

在文档(https://seaborn.pydata.org/generated/seaborn.pairplot.html)中,你可以看到,你只需要在调用函数时设置palette = my_palette,就像这样:
sns.pairplot(train_df, palette = my_palette)

相关问题