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

如何在R语言的PCA散点图中为每个类别添加密度图?

为PCA图添加密度图的实现方案

方法1:添加边际密度图(匹配常见示例图样式)

使用ggExtra包可快速在PCA散点图的x、y轴边缘添加分组对应的密度曲线,步骤如下:

  1. 安装并加载所需包
install.packages("ggExtra")
library(tidyverse)
library(ggplot2)
library(ggExtra)
  1. 修正原代码的物种筛选逻辑并生成基础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()
  1. 添加边际密度图
# 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:54:26