【问题标题】:scatterplot of subset on top of a 2d kdeplot with matching color具有匹配颜色的 2d kdeplot 顶部的子集散点图
【发布时间】:2022-07-27 20:42:35
【问题描述】:

当有许多色调/类别时,如何在包含所有数据的 2D KDEplot 顶部绘制数据子集的散点图?

查看代码以重现我想要避免的内容:散点图与 KDEplot 背景颜色不同。我没有找到执行此操作的“算法”方法。

from sklearn.datasets import make_blobs
import seaborn as sns
# data set generate
X, y = make_blobs(n_samples = 200, n_features = 2, centers = 3, random_state = 2, cluster_std = 1.5)
df = pd.DataFrame(X, columns=['a', 'b'])
df['target'] = y


sns.kdeplot(
    data=df,
    x='a', y='b',
    hue='target',
    fill=True,
    alpha=0.2)


sns.scatterplot(
        data=df,
        x="a", y="b",
        hue="target",
    )

plt.show()

sns.kdeplot(
    data=df,
    x='a', y='b',
    hue='target',
    fill=True,
    alpha=0.2)


sns.scatterplot(
        data=df[df.target==2],
        x="a", y="b",
        hue="target",
    )

【问题讨论】:

  • 为唯一目标创建自定义调色板:1.cats = sorted(df.target.unique()),2.palette = dict(zip(cats, sns.cubehelix_palette(n_colors=len(cats)))),然后将其传递给调色板参数。 palette=palette

标签: python matplotlib seaborn


【解决方案1】:

您需要指定hue_norm:

hue_norm 元组或matplotlib.colors.Normalize

以数据单元为单位设置规范化范围的一对值或将从数据单元映射到 [0, 1] 的对象 间隔。用法意味着数字映射。

sns.scatterplot(
        data=df[df.target==2],
        x="a", y="b",
        hue="target",
        hue_norm=(df.target.min(), df.target.max())
    )

【讨论】:

    【解决方案2】:

    此解决方案适用于分类调色板:

    1. 按正确顺序向hue_order 提供有关预期图例的所有分类
    2. 仅选择与您选择的数据对应的handleslabels 以构建自定义图例。

    _

    import seaborn as sns
    X, y = make_blobs(n_samples = 200, n_features = 2, centers = 3, random_state = 2, cluster_std = 1.5)
    df = pd.DataFrame(X, columns=['a', 'b'])
    df['target'] = y
    unique_y = np.unique(df.target)
    
    sns.kdeplot(
        data=df,
        x='a', y='b',
        hue='target',
        hue_order=unique_y,
        fill=True,
        alpha=0.2,
        palette='deep')
    
    sns.scatterplot(
            data=df,
            x="a", y="b",
            hue="target",
            hue_order=unique_y,
            palette='deep'
        )
    
    plt.show()
    
    sns.kdeplot(
        data=df,
        x='a', y='b',
        hue='target',
        hue_order=unique_y,
        fill=True,
        alpha=0.2,
        palette='deep')
    
    select_data = df[df.target==2]
    sns.scatterplot(
            data=select_data,
            x="a", y="b",
            hue="target",
            hue_order=unique_y,
            palette='deep',
        )
    
    i_labels = np.unique(select_data)
    handles_, labels_ = plt.gca().get_legend_handles_labels()
    handles_ = [h for i, h in enumerate(handles_) if i in i_labels]
    labels_ = [l for i, l in enumerate(labels_) if i in i_labels]
    
    plt.legend(
        handles=handles_,
        labels=labels_,
        bbox_to_anchor=(1, 1),
        title='target'
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 2014-02-18
      • 2019-10-25
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多