如何在Seaborn主成分散点图中添加等高线图?
为PCA散点图添加分类等高线的实现方法
要实现散点图叠加分类等高线的效果,核心思路是针对每个类别单独计算核密度估计(KDE),再绘制对应的等高线,最后叠加散点图。以下是具体实现步骤和代码:
步骤说明
- 先初始化绘图画布,确保所有图层都在同一轴上绘制
- 遍历分类变量的每个类别,提取对应PCA数据并计算密度分布
- 为每个类别绘制等高线(可选择填充或纯轮廓样式)
- 最后叠加原有的着色散点图
完整代码示例
import seaborn as sns import matplotlib.pyplot as plt import numpy as np # 假设你的数据框是dataframe,列名分别为'principal component 1'、'principal component 2'、'categorical variable' plt.figure(figsize=(10, 8)) ax = plt.gca() # 遍历每个分类类别,绘制对应等高线 categories = dataframe['categorical variable'].unique() for cat in categories: # 提取当前类别的PCA数据 subset = dataframe[dataframe['categorical variable'] == cat] x = subset['principal component 1'] y = subset['principal component 2'] # 使用seaborn的kdeplot绘制等高线(fill=True可填充,contour=True绘制轮廓) sns.kdeplot( x=x, y=y, ax=ax, levels=5, # 等高线层数 fill=False, # 若需要填充密度区域设为True alpha=0.7, # 透明度 linestyles='--', # 线条样式 label=f'Contour {cat}' ) # 叠加原有的着色散点图 sns.scatterplot( x=dataframe['principal component 1'], y=dataframe['principal component 2'], hue=dataframe['categorical variable'], ax=ax, s=50, # 散点大小 edgecolor='white' # 散点边缘色,提升辨识度 ) plt.xlabel('Principal Component 1') plt.ylabel('Principal Component 2') plt.legend() plt.show()
关键细节说明
- 如果需要更精细的密度控制,可以使用
scipy.stats.gaussian_kde手动计算密度值,再用plt.contour绘制等高线 - 调整
levels参数可以改变等高线的数量,数值越大轮廓越密集 - 若要填充密度区域,将
fill=True即可,同时可调整alpha控制填充透明度
内容的提问来源于stack exchange,提问作者Niam45
相关产品推荐
相关产品推荐

