facet_wrap()搭配geom_density_2d()绘图结果差异问题咨询
两种ggplot2写法结果差异的原因及解决方案
差异核心原因
两种写法的2D密度估计逻辑完全不同,具体差异有两点:
- 密度计算的参考范围不同
写法1中geom_density_2d()会基于全数据集的PC1、PC3范围统一确定带宽和计算网格,所有Treatment分组的密度估计都在同一全局坐标体系下完成,分组的密度分布会受其他组数据范围的影响。
写法2中每个geom_density_2d()仅使用对应Treatment子集的数据计算密度,带宽和网格范围完全适配当前子集的分布,不受其他组数据干扰。 - 等高线层级划分规则不同
写法1中所有分组的等高线层级是基于全数据集的密度值范围统一划分的,密度较低的分组可能只会显示极少等高线,甚至无显示。
写法2中每个分组的等高线层级是基于自身密度值范围单独划分的,每个分组都会显示默认数量的等高线,视觉上更突出每个分组自身的分布特征。
简洁实现写法2效果的方案
不需要手动拆分数据集,用purrr批量生成每个分组的密度图层即可,逻辑和写法2完全一致,代码简洁且适配任意数量的Treatment分组:
library(purrr) library(dplyr) library(ggplot2) ggplot(data=test,aes(x=PC1, y=PC3, color=Treatment)) + map(unique(test$Treatment), ~geom_density_2d(data = filter(test, Treatment == !! .x))) + theme(aspect.ratio=1) + facet_wrap(~Date)
如果不想额外加载purrr,也可以通过调整stat_density_2d的参数实现分组独立的等高线划分:
ggplot(data=test,aes(x=PC1, y=PC3, color=Treatment)) + stat_density_2d(aes(level = after_stat((density - min(density))/(max(density) - min(density))))) + theme(aspect.ratio=1) + facet_wrap(~Date)
内容的提问来源于stack exchange,提问作者user2955884
相关产品推荐
相关产品推荐

