r - 在 ggplot2 中用 facets 绘制分布的分位数

标签 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))

我尝试通过两种方式添加分位数。第一个产生错误消息:
 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)))

Error in quantile(value, probs = c(0.025, 0.975)) : object 'value' not found


而第二个让我得到完整变量的分位数,而不是子密度。也就是说,绘制的分位数对于所有四种密度都是相同的。
 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)

plot

关于r - 在 ggplot2 中用 facets 绘制分布的分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30568873/

相关文章:

r - ggplot2:所有可能变量组合的散点图

R raster::calc 计算分位数 na.rm = FALSE

r - 如何在 gganimate 中取消按字母顺序排列帧顺序?

R strftime() 行为

r - R中的ggtern等高线图

r - ggplot 点图 : What is the proper use of geom_dotplot?

r - 如何计算 R 中前 10% 的平均值

r - 根据分位数信息确定正态分布

r - 在 R 中绘制每小时曲线

r - 如何自定义Shiny中点击按钮添加的tabPanel