ggplot2 按组密度曲线下的阴影面积

2024-04-15

我有这个数据框:

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()

For site1我需要对曲线下> 1% 数据的区域进行阴影处理。为了site2我需要对曲线下小于数据 75% 的区域进行阴影处理。

我期待情节看起来像这样(经过修图)。在经历了堆栈溢出之后,我知道其他人问过如何对曲线下的部分区域进行着色,但我不知道如何按组对曲线下的区域进行着色。


这是一种方法(正如 @joran 所说,这是响应的扩展here https://stackoverflow.com/questions/3494593/):

#  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)

Produces this:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ggplot2 按组密度曲线下的阴影面积 的相关文章

随机推荐