2013-10-25 16 views
8

This質問は、ggplot2でqqlineを使ってqqplotを作成する方法を示しましたが、答えは1つのグラフにデータセット全体をプロットする場合にのみ有効です。ファセットを持つggplot2のqqline

データのサブセットについて、これらのプロットをすばやく比較する方法が必要です。つまり、ファセットを持つグラフ上にqqplotsをqqlinesで作成したいと考えています。したがって、次の例では、それぞれ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の同じコードで行うことができます。

関連する問題