2013-10-25 49 views
8

This問題顯示瞭如何用ggplot2中的qqline製作qqplot,但答案似乎只在將整個數據集繪製在單個圖中時才起作用。ggplot2中的qqline帶小平面

我想要一種方法來快速比較這些關於我的數據子集的圖。也就是說,我想用圖面上的qqlines創建qqplots。因此在下面的例子中,所有9個地塊都會有線條,每個地塊都有自己的截距和坡度。

df1 = data.frame(x = rnorm(1000, 10), 
       y = sample(LETTERS[1:3], 100, replace = TRUE), 
       z = sample(letters[1:3], 100, replace = TRUE)) 

ggplot(df1, aes(sample = x)) + 
    stat_qq() + 
    facet_grid(y ~ z) 

facet data

回答

8

你可以試試這個:

library(plyr) 

# create some data 
set.seed(123) 
df1 <- data.frame(vals = rnorm(1000, 10), 
        y = sample(LETTERS[1:3], 1000, replace = TRUE), 
        z = sample(letters[1:3], 1000, replace = TRUE)) 

# calculate the normal theoretical quantiles per group 
df2 <- ddply(.data = df1, .variables = .(y, z), function(dat){ 
      q <- qqnorm(dat$vals, plot = FALSE) 
      dat$xq <- q$x 
      dat 
} 
) 

# plot the sample values against the theoretical quantiles 
ggplot(data = df2, aes(x = xq, y = vals)) + 
    geom_point() + 
    geom_smooth(method = "lm", se = FALSE) + 
    xlab("Theoretical") + 
    ylab("Sample") + 
    facet_grid(y ~ z) 

enter image description here

3

沒有很好的理由,這裏的dplyr(它沒有在這個問題的時候存在)同一事物的版本。爲了同行評審和比較,我將提供生成數據集的代碼,以便您可以進一步檢查它們。

# create some data 
set.seed(123) 
df1 <- data.frame(vals = rnorm(10, 10), 
        y = sample(LETTERS[1:3], 1000, replace = TRUE), 
        z = sample(letters[1:3], 1000, replace = TRUE)) 

#* Henrik's plyr version 
library(plyr) 
df2 <- plyr::ddply(.data = df1, .variables = .(y, z), function(dat){ 
      q <- qqnorm(dat$vals, plot = FALSE) 
      dat$xq <- q$x 
      dat 
} 
) 

detach("package:plyr") 


#* The dplyr version 
library(dplyr) 
qqnorm_data <- function(x){ 
    Q <- as.data.frame(qqnorm(x, plot = FALSE)) 
    names(Q) <- c("xq", substitute(x)) 
    Q 
} 

df3 <- df1 %>% 
    group_by(y, z) %>% 
     do(with(., qqnorm_data(vals))) 

可以用Henrik的相同代碼完成繪圖。