R 使用面绘制ggplot2中的分布分位数

R 使用面绘制ggplot2中的分布分位数,r,ggplot2,quantile,density-plot,R,Ggplot2,Quantile,Density Plot,我目前正在绘制一些不同的分布图,这些分布图与ggplot中的一些回归模型的第一个差异。为了便于解释差异,我想标记每个分布的2.5%和97.5%。因为我将要做很多绘图,而且因为数据是在二维(模型和类型)中分组的,所以我想在ggplot环境中定义并绘制相应的百分位数。使用facet绘制分布可以让我精确地找到我想要的位置,除了百分位数。当然,我可以更手动地执行此操作,但我希望找到一个理想的解决方案,在该解决方案中,我仍然能够使用facet\u grid,因为这样可以省去我大量的麻烦,尝试将不同的图装配

我目前正在绘制一些不同的分布图,这些分布图与ggplot中的一些回归模型的第一个差异。为了便于解释差异,我想标记每个分布的2.5%和97.5%。因为我将要做很多绘图,而且因为数据是在二维(模型和类型)中分组的,所以我想在ggplot环境中定义并绘制相应的百分位数。使用facet绘制分布可以让我精确地找到我想要的位置,除了百分位数。当然,我可以更手动地执行此操作,但我希望找到一个理想的解决方案,在该解决方案中,我仍然能够使用
facet\u grid
,因为这样可以省去我大量的麻烦,尝试将不同的图装配在一起

下面是一个使用模拟数据的示例:

df.example <- data.frame(model = rep(c("a", "b"), length.out = 500), 
                      type = rep(c("t1", "t2", "t2", "t1"), 
                      length.outh = 250), value = rnorm(1000))

 ggplot(df.example, aes(x = value)) +
 facet_grid(type ~ model) +
 geom_density(aes(fill = model, colour = model))
而第二个得到的是完整变量的分位数,而不是亚密度的分位数。也就是说,对于所有四种密度,绘制的分位数是相同的

 ggplot(df.example, aes(x = value)) +
 facet_grid(type ~ model) +
 geom_density(aes(fill = model, colour = model)) +
 geom_vline(xintercept = quantile(df.example$value, probs = c(.025, .975)))
因此,我想知道是否有一种方法可以为ggplot2环境中的每个子组绘制特定的分位数

非常感谢您的任何输入。

使用plyr(或dplyr,data.table)预计算这些值

set.seed(1)
# ...

df.q <- ddply(df.example, .(model, type),
              summarize, q=quantile(value, c(.025, .975)))    
p + geom_vline(aes(xintercept=q), data=df.q)
set.seed(1)
# ...

df.q您可以预先计算分位数

使用您的示例数据:

library (dplyr)
d2 <- df.example %>%
  group_by(model, type) %>%
  summarize(lower = quantile(value, probs = .025),
            upper = quantile(value, probs = .975))

好问题。同一问题的更一般版本是:当使用facet时,如何在子集数据集上调用函数?这似乎是一个非常有用的功能,所以我四处搜索,但找不到任何关于它的信息


已经给出的答案非常好。另一种选择是作为手动进行镶嵌面的方式。

非常好的建议。谢谢很好的建议。谢谢我同意。这两种解决方案都非常简洁,但正如你所注意到的,并不能真正解决我在问题中提到的问题。对于ggplot来说,这确实是一个非常有趣的特性。
set.seed(1)
# ...

df.q <- ddply(df.example, .(model, type),
              summarize, q=quantile(value, c(.025, .975)))    
p + geom_vline(aes(xintercept=q), data=df.q)
library (dplyr)
d2 <- df.example %>%
  group_by(model, type) %>%
  summarize(lower = quantile(value, probs = .025),
            upper = quantile(value, probs = .975))
ggplot(df.example, aes(x = value)) +
  facet_grid(type ~ model) +
  geom_density(aes(fill = model, colour = model)) +
  geom_vline(data = d2, aes(xintercept = lower)) +
  geom_vline(data = d2, aes(xintercept = upper))