用facet绘制ggplot2中分布的分位数

chr*_*nsn 2 r ggplot2 quantile density-plot

我目前正在绘制ggplot中许多回归模型的一些不同的第一个差异分布.为了便于解释差异,我想标记每个分布的2.5%和97.5%百分位数.由于我将做很多图,并且由于数据按二维(模型和类型)分组,我想在ggplot环境中定义和绘制各自的百分位数.使用facets绘制分布使我能够准确到达我想要的位置,除了百分位数.我当然可以手动完成这项工作,但理想情况下我希望找到一个我仍然可以使用的解决方案facet_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))
Run Code Online (Sandbox Code Playgroud)

我试图以两种方式添加分位数.第一个产生错误消息:

 ggplot(df.example, aes(x = value)) +
 facet_grid(. ~ model) +
 geom_density(aes(fill = model, colour = model)) +
 geom_vline(aes(x = value), xintercept = quantile(value, probs = c(.025, .975)))
Run Code Online (Sandbox Code Playgroud)
Error in quantile(value, probs = c(0.025, 0.975)) : object 'value' not found
Run Code Online (Sandbox Code Playgroud)

而第二个获取完整变量的分位数而不是子密度.也就是说,绘制的分位数对于所有四个密度是相同的.

 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)))
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法在ggplot2环境中绘制每个子组的特定分位数?

非常感谢任何输入.

rcs*_*rcs 5

使用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)
Run Code Online (Sandbox Code Playgroud)

情节


Axe*_*man 5

您可以预先计算分位数。

使用您的示例数据:

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

然后像这样绘制:

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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述