2013-03-28 15 views
5

Come posso rendere sovrapposti perfettamente i valori anomali di geom_boxplot con geom_points jitter?Come posso rendere "out-line" gli outlier di geom_boxplot con geom_points jitter?

Ad esempio, voglio che i valori anomali di geom_boxplot vengano visualizzati come "mirini" sui loro punti effettivi da geom_point dopo il jittering?

library(ggplot2) 
p <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
    geom_boxplot(outlier.shape=10, outlier.size=8) + 
    geom_point(aes(factor(cyl), mpg, color=mpg), position="jitter", size=4) 
p 

plot

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

4

Questa soluzione sarà piuttosto lunga. Il problema è che con position="jitter" non è possibile ottenere le coordinate esatte per i punti, quindi è necessario trovare una soluzione alternativa.

Quindi prendi la tua trama originale e salvala con ggplot_build(). Il primo elemento di dati contiene informazioni sui boxplot. Siamo interessati alla colonna group e outliers in quanto mostra quali valori ggplot assume come valori anomali. Salvali come oggetto separato.

p <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
       geom_boxplot(outlier.shape=10, outlier.size=8) + 
       geom_point(aes(color=mpg), position="jitter", size=4) 
gg<-ggplot_build(p) 
gg$data[[1]] 
    ymin lower middle upper ymax   outliers notchupper notchlower x PANEL group weight ymin_final 
1 21.4 22.80 26.0 30.40 33.9     29.62055 22.37945 1  1  1  1  21.4 
2 17.8 18.65 19.7 21.00 21.4     21.10338 18.29662 2  1  2  1  17.8 
3 13.3 14.40 15.2 16.25 18.7 10.4, 10.4, 19.2 15.98120 14.41880 3  1  3  1  10.4 
    ymax_final xmin xmax 
1  33.9 0.625 1.375 
2  21.4 1.625 2.375 
3  19.2 2.625 3.375 

xx<-gg$data[[1]][c("group","outliers")] 
xx 
    group   outliers 
1  1     
2  2     
3  3 10.4, 10.4, 19.2 

Ora cambia group valori a 4,6 e 8 per essere lo stesso cyl valori.

xx$group<-c(4,6,8) 

Unire questo nuovo frame di dati con l'originale mtcars e salvare come nuova cornice di dati. Quindi applicare la funzione per verificare se il valore di è elencato in outliers per il livello cyl. Tali valori (TRUE e FALSE) vengono salvati nella colonna out.

mtcars.new<-merge(mtcars,xx,by.x="cyl",by.y="group") 
mtcars.new$out<-apply(mtcars.new,1,function(x) x$mpg %in% x$outliers) 

Utilizzare un nuovo riquadro dati per stampare i dati. Rimuovi i valori anomali dal modulo geom_boxplot(). Utilizzare la colonna out per determinare la forma e la dimensione dei punti. Con scale_shape_manual() e scale_size_manual() regolare l'aspetto.

ggplot(mtcars.new, aes(factor(cyl), mpg)) + 
      geom_boxplot(outlier.shape = NA) + 
      geom_point(aes(color=mpg,shape=out,size=out), position="jitter")+ 
      scale_shape_manual(values=c(16,10),guide="none")+ 
      scale_size_manual(values=c(4,8),guide="none") 

enter image description here

5

Sono d'accordo con Didzis che una soluzione che fa esattamente ciò si mira per sta per essere abbastanza coinvolto. Per fare letteralmente ciò che suggerisci, ti chiedo (credo) di eseguire sia il jittering che il calcolo outlier al di fuori di ggplot. Se sei flessibile su come evidenziare i valori anomali, questa è una soluzione potenzialmente più breve:

id_outliers <- function(x){ 
    q <- quantile(x,c(0.25,0.75)) 
    iqr <- abs(diff(q)) 
    ifelse((x < q[1] - 1.5*iqr) | (x > q[2] + 1.5*iqr),'Outlier','NotOutlier') 
} 

mtcars <- ddply(mtcars, 
       .(cyl), 
       transform, 
       out = id_outliers(mpg)) 

p <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
    geom_boxplot(outlier.colour = NA) + 
    geom_point(aes(colour = mpg,shape = out),position = "jitter") 
Problemi correlati