我目前正在绘制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环境中绘制每个子组的特定分位数?
非常感谢任何意见。
答案 0 :(得分: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)
答案 1 :(得分:3)
您可以预先计算分位数。
使用您的示例数据:
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))
答案 2 :(得分:0)
好问题。同一问题的更一般版本是:在使用构面时,如何在子集化数据集上调用函数?这似乎是一个非常有用的功能,所以我搜索周围但没有找到任何关于它。
已经给出的答案非常好。另一种选择是使用multiplot()
作为手动进行分面的方法。