如何使用ggplot在一个区间内填充密度图?

How to fill density plot within an interval with ggplot?

下面的代码用曲线区域下方的颜色填充两个密度中的每一个:

library(ggplot2)

#fake data
dat <- data.frame(dens = c(rnorm(100), rnorm(100, 2, 0.5))
                   , group = rep(c("C", "P"), each = 100))

#fill the area under the curve
ggplot(dat, aes(x = dens, fill = group)) + geom_density(alpha = 0.75)

如何实现以下两个目标?

1) 只在指定区间内填充每条曲线。例如,组 'C' 的区间 [-1.5, 2.0] 和组 'P' 的区间 [0.5, 2.8]。

2) 为每个密度添加一个垂直段(从 x 轴到曲线)。例如,组 'C' 的 x=0.2 和组 'P'.

的 x=1.9

为了让你大吃一惊,这是你的第一个问题:

library(dplyr)
library(purrr)
library(tidyr)
library(ggplot2)

as.data.frame.density <- function(x) data.frame(x = x$x, y = x$y)

densities <- dat %>% 
  group_nest(group) %>% 
  mutate(dens = map(data, ~as.data.frame(density(.$dens)))) %>% 
  unnest(dens)

ggplot(densities, aes(x = x, y = y, group = group)) + 
  geom_density(stat = 'identity') +
  geom_density(
    aes(fill = group),
    . %>% filter((group == "C" & between(x, -1.5, 2.0)) | (group == "P" & between(x, 0.5, 2.8))),
    stat = 'identity',
    alpha = 0.75
  )

还有其他计算每组密度的方法,使用 dplyr 只是一种方法。为两个密度估计设置一个相等的带宽可能是好的。

添加段与此方法类似,您只需要在 densities data.frame.

中找到正确的值