2013-10-25 3 views
8

This вопрос показал, как сделать qqplot с qqline в ggplot2, но ответ, похоже, работает только при построении всего набора данных в одном графике.qqline в ggplot2 с грани

Я хочу, чтобы быстро сравнить эти графики для подмножеств моих данных. То есть, я хочу сделать 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.

Смежные вопросы