2013-03-28 11 views
5

Wie kann ich geom_boxplot Ausreißer perfekt mit jittered geom_points überlagern?Wie kann ich geom_boxplot-Ausreißer mit getippten geom_points "ausrichten"?

Zum Beispiel möchte ich die Ausreißer von geom_boxplot als "Fadenkreuz" über ihre tatsächlichen Punkte von Geom_point nach Jitter angezeigt werden?

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

würde Jede Hilfe sehr geschätzt.

Antwort

4

Diese Lösung wird ziemlich lang sein. Problem ist, dass mit position="jitter" Sie nicht genaue Koordinaten für Punkte erhalten können, daher müssen Sie eine Problemumgehung finden.

Nehmen Sie also Ihre ursprüngliche Handlung und speichern Sie sie mit ggplot_build(). Das erste Datenelement enthält Informationen über Boxplots. Wir sind an den Spalten group und outliers interessiert, da es zeigt, welche Werte ggplot als Ausreißer annimmt. Speichern Sie sie als separates Objekt.

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 

Jetzt group Werte 4,6 und 8 ändern die gleiche wie cyl Werte.

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

nun diesen neuen Datenrahmen mit original mtcars fusionieren und als neuem Datenrahmen speichern. Wenden Sie dann die Funktion an, um zu prüfen, ob der Wert mpg für diesen cyl Wert in outliers aufgeführt ist. Diese Werte (TRUE und FALSE) werden in der Spalte out gespeichert.

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) 

Verwenden Sie einen neuen Datenrahmen zum Plotten von Daten. Entfernen Sie Ausreißer aus geom_boxplot(). Verwenden Sie die Spalte out, um die Form und Größe der Punkte zu bestimmen. Mit scale_shape_manual() und scale_size_manual() Aussehen anpassen.

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

ich mit Didzis darüber einig, dass eine Lösung, die tut genau, was Sie wollen wird ziemlich beteiligt sein. Um buchstäblich zu tun, was Sie vorschlagen, würde (ich denke), dass Sie sowohl die Zittern und die Ausreißer Berechnung außerhalb von ggplot tun. Wenn Sie flexibel sind, wie Sie die Ausreißer hervorheben, ist dies eine potenziell kürzere Lösung:

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") 
Verwandte Themen