2017-03-08 64 views
5

Poszukuję wygodniejszego sposobu uzyskania wykresu Q-Q w ggplot2, gdzie kwantyle są obliczane dla zbioru danych jako całości. ale mogę używać odwzorowań (kolorów/kształtów) dla grup w danych.Wykres Q-Q z ggplot2 :: stat_qq, colours, single group

library(dplyr) 
library(ggplot2) 
library(broom) ## for augment() 

Makijaż pewne dane:

set.seed(1001) 
N <- 1000 
G <- 10 
dd <- data_frame(x=runif(N), 
      f=factor(sample(1:G,size=N,replace=TRUE)), 
      y=rnorm(N)+2*x+as.numeric(f)) 
m1 <- lm(y~x,data=dd) 
dda <- cbind(augment(m1),f=dd$f) 

Podstawowe działki:

ggplot(dda)+stat_qq(aes(sample=.resid)) 

enter image description here

gdy próbuję dodać kolor, grupy się oddzielić za kwantyla obliczeń (których nie chcę):

ggplot(dda)+stat_qq(aes(sample=y,colour=f)) 

enter image description here

Jeśli używam stat_qq(aes(sample=y,colour=f,group=1)) ggplot ignoruje specyfikację kolorów i zdobyć pierwszy wykres powrotem.

Chcę wykres, na którym punkty są ustawione tak, jak w pierwszym przypadku, ale w kolorze, jak w drugim przypadku. Mam qqnorm opartych ręcznego rozwiązania, które można wysłać, ale szukam czegoś ładniejszy ...

Odpowiedz

2

Można obliczyć quantiles siebie, a następnie wykreślić używając geom_point:

dda = cbind(dda, setNames(qqnorm(dda$.resid, plot.it=FALSE), c("Theoretical", "Sample"))) 

ggplot(dda) + 
    geom_point(aes(x=Theoretical, y=Sample, colour=f)) 

enter image description here

Ah Myślę, że powinienem czytać do końca twojego pytania. To jest ręczne rozwiązanie, do którego się odnosiłeś, prawda? Chociaż mógłbyś go po prostu zapakować jako funkcję:

my_stat_qq = function(data, colour.var) { 

    data=cbind(data, setNames(qqnorm(data$.resid, plot.it=FALSE), c("Theoretical", "Sample"))) 

    ggplot(data) + 
    geom_point(aes_string(x="Theoretical", y="Sample", colour=colour.var)) 

} 

my_stat_qq(dda, "f") 
+0

Tak, to jest rozwiązanie ręczne, o którym mówiłem (twoje jest nieco lepsze niż moje). –