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

如何用ggplot2绘制按因子着色的重叠2D密度PCA图?

解决ggplot2中PCA数据重叠2D密度区域着色问题

要实现按指定因子(class)着色的重叠2D密度区域,且每个因子组内密度越高颜色越深,你需要调整stat_density_2d()的参数,核心是切换到填充型几何对象并映射密度层级到填充颜色:

核心问题分析

你之前的代码ggplot(mydf, aes(PC1, PC2,colour=as.factor(class))) + stat_density_2d()默认使用geom="density_2d",只会绘制等高线条纹,而非填充区域。要实现填充效果,需要指定几何对象为"polygon"或使用geom_contour_filled,并将密度层级(level)映射到fill参数。

方案1:单组渐变+多组重叠(推荐)

如果希望同一组内用颜色深浅表示密度,不同组用不同主色调,可结合ggnewscale为每个组单独设置渐变色标:

library(ggplot2)
library(ggnewscale)

# 初始化绘图,先绘制第一组的密度区域
p <- ggplot(mydf[mydf$class == "Group1", ], aes(PC1, PC2)) +
  stat_density_2d(
    aes(fill = after_stat(level)),
    geom = "polygon",
    alpha = 0.5  # 透明度过渡,方便查看重叠区域
  ) +
  scale_fill_gradient(low = "#6baed6", high = "#08519c") +  # 蓝色渐变,密度越高颜色越深
  labs(fill = "Group1 密度")

# 添加第二组的密度区域,使用新的色标
p <- p + new_scale_fill() +
  stat_density_2d(
    data = mydf[mydf$class == "Group2", ],
    aes(fill = after_stat(level)),
    geom = "polygon",
    alpha = 0.5
  ) +
  scale_fill_gradient(low = "#fc9272", high = "#de2d26") +  # 红色渐变
  labs(fill = "Group2 密度")

# 可选:添加原始PCA散点作为参考
p <- p + geom_point(data = mydf, aes(colour = class), size = 0.5, alpha = 0.3) +
  scale_colour_manual(values = c("#08519c", "#de2d26"))

print(p)

方案2:统一色标简化版

如果不需要单独色标,仅用同一色标结合分组区分,可直接映射interaction(class, after_stat(level))到填充色:

library(ggplot2)

ggplot(mydf, aes(PC1, PC2, group = class)) +
  stat_density_2d(
    aes(fill = interaction(class, after_stat(level))),
    geom = "polygon",
    alpha = 0.6
  ) +
  scale_fill_viridis_d(option = "plasma", guide = "none") +  # 用连续离散色标体现密度
  geom_point(aes(colour = class), size = 0.5, alpha = 0.4)

关键参数说明

  • after_stat(level):提取密度计算后的层级值,用于映射颜色深浅,层级越高代表密度越大。
  • geom = "polygon":将密度等高线转换为可填充的多边形区域。
  • alpha:调整填充区域的透明度,确保重叠部分可见。

内容的提问来源于stack exchange,提问作者Mattia_C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:55:29