You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多hue/类别场景下,如何在全数据2D KDEplot上绘制子集scatterplot?

问题解决:KDEplot与子集散点图颜色匹配方案

问题场景

当数据包含多类别(hue字段)时,先基于全量数据绘制2D KDE填充图,再在上方绘制某单一类别子集的散点图,出现散点颜色与对应类别KDE颜色不一致的问题。

问题原因

Seaborn在绘制散点图时,若传入的数据仅包含单一类别,会自动重置颜色映射逻辑,不再沿用KDEplot使用的全局调色板,导致颜色不匹配。

解决方法

方法1:手动指定全局调色板

先获取Seaborn的默认调色板(或自定义调色板),让KDEplot和scatterplot共用同一套颜色规则:

from sklearn.datasets import make_blobs
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

# 生成数据集
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

# 获取Seaborn默认调色板(类别数与target一致)
palette = sns.color_palette(n_colors=len(df['target'].unique()))

# 绘制全量数据KDE图
sns.kdeplot(
    data=df,
    x='a', y='b',
    hue='target',
    fill=True,
    alpha=0.2,
    palette=palette  # 指定调色板
)

# 绘制单一类别子集散点图,手动指定对应颜色
sns.scatterplot(
    data=df[df.target == 2],
    x="a", y="b",
    color=palette[2],  # 直接使用调色板中对应索引的颜色
    s=50  # 可选:调整散点大小
)

plt.legend(title='target', labels=[0,1,2])  # 手动维护图例(可选)
plt.show()

方法2:保留全局hue映射

让scatterplot知晓所有类别存在,即使只绘制子集,避免重置颜色映射:

from sklearn.datasets import make_blobs
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

# 生成数据集
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

# 绘制全量数据KDE图
sns.kdeplot(
    data=df,
    x='a', y='b',
    hue='target',
    fill=True,
    alpha=0.2
)

# 绘制子集散点图,指定hue_order和palette继承全局规则
sns.scatterplot(
    data=df[df.target == 2],
    x="a", y="b",
    hue="target",
    hue_order=df['target'].unique(),  # 指定所有类别顺序
    legend=False  # 关闭散点图例,避免重复
)

plt.show()

效果说明

两种方法都能保证散点颜色与对应类别的KDE填充颜色完全一致,同时保留KDE图的完整类别图例。

内容的提问来源于stack exchange,提问作者Cyril

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 12:24:14