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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 18:05:04