2013-10-25 21 views
8

This sorusu, qqplot'u ggplot2'de qqline ile nasıl yapılacağını gösterdi, ancak yanıt yalnızca tüm veri kümesini tek bir grafikte çizerken işe yaramaktadır.qqline ggplot2, facebook

çabuk benim veri alt kümeleri için bu araziler karşılaştırmak için bir yol istiyoruz. Yani, fasetlerle bir grafikte qqlines ile qqplots yapmak istiyorum. Bu nedenle, aşağıdaki örnekte, her biri kendi kesişme noktası ve eğimi olan 9 parsel için çizgiler olacaktır.

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

cevap

8

Bunu denemek olabilir: hayır İyi bir neden için

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

, burada dplyr (bu sorunun anda var yoktu) var Aynı şeyin versiyonu. Akran değerlendirmesi ve karşılaştırması için, veri kümelerini oluşturan kodları size daha iyi inceleyebilmeniz için sağlayacağım.

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

Çizim, aynı koddan Henrik ile yapılabilir.