如何在R语言的PCA散点图中为每个类别添加密度图?
为PCA图添加密度图的实现方案
方法1:添加边际密度图(匹配常见示例图样式)
使用ggExtra包可快速在PCA散点图的x、y轴边缘添加分组对应的密度曲线,步骤如下:
- 安装并加载所需包
install.packages("ggExtra") library(tidyverse) library(ggplot2) library(ggExtra)
- 修正原代码的物种筛选逻辑并生成基础PCA图
x <- iris[1:4] pc <- prcomp(x) df <- cbind(pc$x[,1:2], iris[,5]) %>% as.data.frame() df$PC1 <- as.numeric(df$PC1) / (pc$sdev[1] * sqrt(nrow(iris))) df$PC2 <- as.numeric(df$PC2) / (pc$sdev[2] * sqrt(nrow(iris))) df$V3 <- as.factor(df$V3) # 修正物种筛选:用实际物种名替代数字 p1 <- ggplot(df, aes(PC1, PC2, colour = V3)) + geom_point(size = 3, aes(shape = V3)) + stat_ellipse(geom = "polygon", aes(fill = after_scale(alpha(colour, 0))), data = df[df$V3 %in% c("setosa", "versicolor"),], size = 1) + theme_bw()
- 添加边际密度图
# type指定为"density"生成密度曲线,groupColour/groupFill按分组着色 ggMarginal(p1, type = "density", groupColour = TRUE, groupFill = TRUE)
方法2:在散点图内叠加2D密度轮廓
若需在PCA散点上直接展示数据的二维分布集中度,可使用ggplot2自带的密度图层:
叠加密度轮廓线
p1 + geom_density2d(aes(colour = V3), alpha = 0.6, linewidth = 1)
叠加填充密度区域
p1 + stat_density2d(aes(fill = V3, alpha = stat(density)), geom = "polygon", bins = 8) + scale_alpha_continuous(range = c(0.1, 0.3)) + guides(alpha = "none")
说明
- 方法1生成的边际密度图是学术图表中常用的PCA+密度展示形式,与你提到的示例图(E)样式匹配。
- 方法2适合直观呈现数据在PCA空间的聚集程度。
内容的提问来源于stack exchange,提问作者PesKchan
相关产品推荐
相关产品推荐

