stat_qq在设置组时删除值

时间:2014-02-05 08:28:43

标签: r ggplot2

我想在ggplot2制作一个QQ情节,其中少数几个点应该有不同的形状。但是当我将形状映射到美学中的变量时,stat_qq包含此变量来分割数据(涉及2x3因素)。

这是一个可重复的例子:

library(ggplot2)
set.seed(331)

df <- do.call(rbind, replicate(10, {expand.grid(method=factor(letters[1:3]), model=factor(LETTERS[1:2]))}, simplify=FALSE ))
df$x <- runif(nrow(df))
df$y <- rnorm(nrow(df), sd=0.2) + 1*as.integer(df$method)
df$top <- FALSE
df <- df[order(df$y, decreasing=TRUE),]
df$top[which(df$method=='a')[1:10]] <- TRUE

到目前为止,我已经成功制作了一个简单的QQ情节:

ggplot(df, aes(sample=y, colour=method)) + stat_qq() + facet_grid(.~model)

ggplot(df, aes(sample=y, colour=method)) + stat_qq() + facet_grid(.~model)

这基本上是我想要的,除了手中充满了具有不同形状的方法'a'中的点,如变量'top'所示。 从代码中,我们知道这些对应于每个模型中方法'a'中的前5个值;即每个小平面中最左边的五个红点应该具有不同的形状。 在这里,我试图将其添加为美学:

ggplot(df, aes(sample=y, colour=method, shape=top)) + stat_qq() + facet_grid(.~model)

ggplot(df, aes(sample=y, colour=method, shape=top)) + stat_qq() + facet_grid(.~model)

现在,很明显,stat_qq已包含变量'top'来分割数据集,因为前5个数据点是与非顶点平行绘制的。 这不是预期的。

如何指导stat_qq如何对数据进行分组? 我可以尝试一下群体美学:

ggplot(df, aes(sample=y, colour=method, shape=top, group=method)) + stat_qq() + facet_grid(.~model)
Warning messages:
1: Removed 10 rows containing missing values (geom_point). 
2: Removed 10 rows containing missing values (geom_point). 

ggplot(df, aes(sample=y, colour=method, shape=top, group=method)) + stat_qq() + facet_grid(.~model)

但由于某种原因,这完全删除了连接到模型的所有数据点。

任何想法如何克服这个?

1 个答案:

答案 0 :(得分:4)

由于你想违反ggplot2的一个基本概念,在ggplot之外进行计算会更容易:

library(plyr)
df <- ddply(df, .(model, method), 
            transform, theo=qqnorm(y, plot.it=FALSE)[["x"]])

ggplot(df, aes(x=theo, y=y, colour=method, shape=top)) + 
    geom_point() + facet_grid(.~model)

enter image description here