Площадь теней ggplot2 по кривой плотности по группам

У меня есть этот фреймворк:

set.seed(1)
x <- c(rnorm(50, mean = 1), rnorm(50, mean = 3))
y <- c(rep("site1", 50), rep("site2", 50))
xy <- data.frame(x, y)

И я сделал этот график плотности:

library(ggplot2)
ggplot(xy, aes(x, color = y)) + geom_density()

enter image description here

Для site1 Мне нужно затенять область под кривой, чтобы > 1% данных. Для site2 мне нужно затенять область под кривой, 75% данных.

Я ожидаю, что сюжет будет выглядеть примерно так (фотошоп). Пройдя через переполнение стека, я знаю, что другие спрашивали, как затенять часть области под кривой, но я не могу понять, как затенять область под кривой группой.

enter image description here

Ответ 1

Вот один из способов (и, как говорит @joran, это расширение ответа здесь):

#  same data, just renaming columns for clarity later on
#  also, use data tables
library(data.table)
set.seed(1)
value <- c(rnorm(50, mean = 1), rnorm(50, mean = 3))
site  <- c(rep("site1", 50), rep("site2", 50))
dt    <- data.table(site,value)
#  generate kdf
gg <- dt[,list(x=density(value)$x, y=density(value)$y),by="site"]
#  calculate quantiles
q1 <- quantile(dt[site=="site1",value],0.01)
q2 <- quantile(dt[site=="site2",value],0.75)
# generate the plot
ggplot(dt) + stat_density(aes(x=value,color=site),geom="line",position="dodge")+
  geom_ribbon(data=subset(gg,site=="site1" & x>q1),
              aes(x=x,ymax=y),ymin=0,fill="red", alpha=0.5)+
  geom_ribbon(data=subset(gg,site=="site2" & x<q2),
              aes(x=x,ymax=y),ymin=0,fill="blue", alpha=0.5)

Производит следующее:

Ответ 2

Вам нужно использовать заливку. цвет управляет контуром графика плотности, который необходим, если вы хотите нечерные контуры.

ggplot(xy, aes(x, color=y, fill = y, alpha=0.4)) + geom_density()

Чтобы получить что-то подобное. Затем вы можете удалить альфа-часть легенды, используя

ggplot(xy, aes(x, color = y, fill = y, alpha=0.4)) + geom_density()+ guides(alpha='none')