r - 按组划分的密度曲线下的ggplot2阴影面积

标签 r 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% 数据的区域进行着色。

我期待情节看起来像这样(photoshopped)。经历过堆栈溢出后,我知道其他人问过如何对曲线下的部分区域进行着色,但我无法弄清楚如何按组对曲线下的区域进行着色。

enter image description here

最佳答案

这是一种方式(正如@joran 所说,这是响应 here 的扩展):

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

产生这个:

关于r - 按组划分的密度曲线下的ggplot2阴影面积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20355849/

相关文章:

r - 使用 geom_smooth 将 glm 拟合到分数

r - 将 `top_n` 和 `arrange` 传递给 ggplot (dplyr)

r - ggplot2 删除无意义的零

sql-server - 与 SQL Server(和 Sybase 12.5)的 DBI 连接不返回希腊字符

R:为什么 group_by 即使在使用 quosures 时仍然需要 "do"

r - Shinyapps 部署在本地计算机上工作时无法工作

r - 在 geom_histogram 或 stat_bin 上叠加 geom_points

r - 我如何使用 ggplot() 来创建这个图?

r - 如何使用数据后面的abline()绘制网格线?

r - 仅选择特定列具有最高值的行