如何用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
相关产品推荐
相关产品推荐

