5

我目前正在从 ggplot 中的许多回归模型中绘制许多不同的一阶差异分布。为了便于解释差异,我想标记每个分布的 2.5% 和 97.5% 百分位数。由于我将绘制很多图,并且因为数据是按二维(模型和类型)分组的,所以我想在 ggplot 环境中定义和绘制相应的百分位数。使用构面绘制分布可以让我准确地到达我想要的位置,除了百分位数。我当然可以更手动地执行此操作,但理想情况下,我希望找到一个我仍然可以使用的解决方案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 环境中的每个子组绘制特定的分位数?

非常感谢任何输入。

4

4 回答 4

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)

阴谋

于 2015-06-01T09:04:13.990 回答
4

您可以预先计算分位数。

使用您的示例数据:

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

在此处输入图像描述

于 2015-06-01T09:04:24.380 回答
1

如今,可以使用stat_summary()选项orientation来获得相同的结果而无需预先计算。

为每个面板定义一个虚拟y值,以将观察值与 一起分组 orientation = "y"。然后使用自定义fun计算stat_summary(). 要将结果显示为垂直线,请在美学规范中指定 计算值geom = "vline"及其所需,现在使用计算结果。xinterceptxxintercept = after_stat(x)fun

library(ggplot2)

set.seed(1)

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)) +
  stat_summary(
    geom = "vline",
    orientation = "y",
    # y is a required aesthetic, so use a dummy value
    aes(y = 1, xintercept = after_stat(x)),
    fun = function(x) {
      quantile(x, probs = c(0.025, 0.975))
    }
  )

于 2021-12-08T14:05:54.550 回答
0

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

已经给出的答案非常好。另一种选择是multiplot()用作手动进行刻面的一种方式。

于 2015-06-01T09:17:22.783 回答