2013-10-25 11 views
8

This Frage zeigte, wie man einen qqplot mit einer qqline in ggplot2 erstellt, aber die Antwort scheint nur zu funktionieren, wenn das gesamte Dataset in einem einzigen Diagramm gezeichnet wird.qqline in ggplot2 mit Facetten

Ich möchte einen Weg, um diese Diagramme für Teilmengen meiner Daten schnell zu vergleichen. Das heißt, ich möchte qqplots mit qqlines in einem Graphen mit Facetten machen. Im folgenden Beispiel wären also Linien für alle 9 Plots mit jeweils eigenem Schnittpunkt und Neigung vorhanden.

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

Antwort

8

Sie können dies versuchen:

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

ohne guten Grund, hier ist die dplyr (die nicht zum Zeitpunkt dieser Frage noch nicht gab) Version der gleichen Sache. Im Interesse eines Peer-Review und Vergleichs stelle ich Ihnen einen Code zur Verfügung, der die Datensätze generiert, damit Sie sie weiter untersuchen können.

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

Die Zeichnung kann mit dem gleichen Code von Henrik erfolgen.

Verwandte Themen