如何在PCA图中绘制不规则形状(替代椭圆区域)?
用凸包/密度轮廓实现PCA分组的不规则边界可视化
factoextra包的ellipse.type参数仅支持各类椭圆型边界,无法生成不规则形状。要实现你想要的效果,推荐用凸包(Convex Hull)或密度轮廓线来替代椭圆,以下是基于ggplot2的具体实现步骤:
步骤1:准备PCA结果与坐标数据
先完成PCA分析,提取个体的主成分坐标,并关联分组信息:
library(factoextra) library(ggplot2) library(dplyr) # 假设你的脂肪酸数据集为fatty_acid,分组列名为Group pca_result <- PCA(fatty_acid[, !colnames(fatty_acid) %in% "Group"], scale.unit = TRUE, graph = FALSE) pca_ind <- get_pca_ind(pca_result) # 合并主成分坐标与分组 pca_df <- data.frame( PC1 = pca_ind$coord[, "Dim.1"], PC2 = pca_ind$coord[, "Dim.2"], Group = fatty_acid$Group )
步骤2:方法一:绘制凸包边界(硬不规则形状)
凸包会连接每个分组的最外围样本点,形成贴合数据分布的不规则多边形:
# 定义函数提取每组的凸包顶点 get_convex_hull <- function(df) { df[chull(df$PC1, df$PC2), ] } # 按分组计算凸包数据 hull_data <- pca_df %>% group_by(Group) %>% do(get_convex_hull(.)) # 绘制PCA散点+凸包 ggplot(pca_df, aes(x = PC1, y = PC2, color = Group)) + geom_point(size = 2) + # 添加半透明填充的凸包 geom_polygon(data = hull_data, aes(fill = Group), alpha = 0.2, color = NA) + # 标注主成分解释率 labs(x = paste0("PC1 (", round(pca_ind$contrib[1, "Dim.1"], 1), "%)"), y = paste0("PC2 (", round(pca_ind$contrib[1, "Dim.2"], 1), "%)")) + theme_minimal()
步骤3:方法二:绘制密度轮廓边界(软不规则形状)
如果想要基于数据密度的平滑不规则边界,可以用2D密度轮廓:
ggplot(pca_df, aes(x = PC1, y = PC2, color = Group)) + geom_point(size = 2) + # 添加密度填充轮廓 stat_density_2d(aes(fill = Group), alpha = 0.2, geom = "polygon") + labs(x = paste0("PC1 (", round(pca_ind$contrib[1, "Dim.1"], 1), "%)"), y = paste0("PC2 (", round(pca_ind$contrib[1, "Dim.2"], 1), "%)")) + theme_minimal()
两种方法可以根据你的目标图形选择:凸包适合展示样本的外围边界,密度轮廓适合体现数据的分布集中程度。
内容的提问来源于stack exchange,提问作者Jellz
相关产品推荐
相关产品推荐

