You need to enable JavaScript to run this app. facet_wrap()搭配geom_density_2d()绘图结果差异问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

facet_wrap()搭配geom_density_2d()绘图结果差异问题咨询

两种ggplot2写法结果差异的原因及解决方案

差异核心原因

两种写法的2D密度估计逻辑完全不同,具体差异有两点:

  1. 密度计算的参考范围不同
    写法1中geom_density_2d()会基于全数据集的PC1、PC3范围统一确定带宽和计算网格,所有Treatment分组的密度估计都在同一全局坐标体系下完成,分组的密度分布会受其他组数据范围的影响。
    写法2中每个geom_density_2d()仅使用对应Treatment子集的数据计算密度,带宽和网格范围完全适配当前子集的分布,不受其他组数据干扰。
  2. 等高线层级划分规则不同
    写法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 21:06:04