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

如何修改seaborn pairplot点绘制顺序 显示被遮挡数据点

seaborn pairplot 调整散点绘制层级解决遮挡问题

仅通过设置pd.Categorical的类别顺序无法改变散点的实际绘制层级,seaborn遍历DataFrame行的顺序就是散点的绘制顺序:先遍历到的点先绘制,处于图层底层,会被后遍历到的点覆盖。要调整点的显示层级,只需要在绘图前对DataFrame按目标层级排序即可,同时提前固定标签与颜色的映射关系,就能保证颜色不混乱。

修正后可直接运行的代码

import seaborn as sns
import pandas as pd

# 原始数据集
data = {'Feat1': [-46.220314, -23.80669, -42.092365, -35.29639, -37.075096, -42.8849, -32.3057, -24.469942, -97.89892, -81.96325, -78.41986, -100.68544, -87.05412, -64.121056, -94.504845, -61.951996, -108.19452, -97.4037, -92.641335, -199.18787, -137.5976, -208.0035, -108.225975, -121.29299],
        'Feat2': [22.862856, 20.536781, 25.680704, 21.709473, 22.347767, 28.03802, 26.568039, 27.005375, -0.38156664, 0.1821717, -6.766374, -4.5810957, -2.9231584, -3.7892206, -0.9999217, -8.960198, 13.909201, 22.897585, 22.10624, 3.3090565, 6.795896, -1.33229, 14.341716, 18.274035],
        'Feat3': [-6.1573067, -5.015675, -5.0092897, -4.160352, -3.860426, -7.8572545, -9.47018, -9.301921, 6.4163384, -1.2870358, 0.8001185, 1.6977689, 6.817379, -0.283514, 3.2884297, -1.5915259, 0.6966458, -2.8488266, -3.5110545, -2.5994794, 1.6793671, -3.2078092, 1.02891, 2.2891548],
        'Feat4': [5.6060414, 4.2216353, 5.665794, 5.578346, 5.6953945, 3.3361, 3.4532788, 4.3995037, 7.234347, 4.703838, 0.83444935, 1.8801615, 5.4460077, 6.3084154, 6.881124, 5.6160254, -1.956591, 1.4105041, 2.467166, 4.0802555, 2.2256763, 1.5177402, -1.8651972, 2.3360753],
        'Labels': [2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]}
df = pd.DataFrame(data)

sns.set(style='darkgrid', context='notebook')
# 提前固定标签与颜色的映射,调整顺序时颜色不会错乱
color_map = dict(zip(['0', '1', '2'], sns.color_palette('tab10', 3)))

# 示例1:绘制层级从底到顶为 0→1→2,标签2的点在最上层,不会被遮挡
df_layer2 = df.copy()
df_layer2['Labels'] = df_layer2['Labels'].astype(str)
# 排序:底层类别放在DataFrame前部,顶层类别放在后部
df_layer2 = df_layer2.sort_values(by='Labels', ascending=True)
sns.pairplot(df_layer2, hue='Labels', palette=color_map)

# 示例2:绘制层级从底到顶为 2→1→0,标签0的点在最上层,不会被遮挡
df_layer0 = df.copy()
df_layer0['Labels'] = df_layer0['Labels'].astype(str)
df_layer0 = df_layer0.sort_values(by='Labels', ascending=False)
sns.pairplot(df_layer0, hue='Labels', palette=color_map)

关键说明

  • 排序规则直接对应图层顺序:sort_values排序后,DataFrame中越靠后的行,对应散点绘制越晚,图层位置越高,不会被前面的点遮挡。
  • 不需要额外设置pd.Categorical的顺序参数,只要提前用字典固定每个标签的对应颜色,不管绘制顺序怎么调整,颜色匹配关系不会发生变化。
  • 原代码中y_train.astype(str)为未定义变量错误,直接对DataFrame内的Labels列做类型转换即可。

pairplot示例图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:06:26