2017-12-10 4 views
2

Ich versuche, Beschriftungen von Beobachtungen zählt an den Enden der Boxplot Whiskers, aber es scheint nicht zu funktionieren, wenn es Ausreißer gibt.Konnte Label nicht an Boxplot Whisker mit vorhandenen Ausreißern setzen

Ich habe versucht, die Max/Min-Werte mit der berechneten Whiskerlänge zu vergleichen [Quartil 1 (oder Quartil 3) + (oder -) 1,5 * Interquartilsbereich]. Die Etiketten werden jedoch weder auf den Höchst-/Mindestwert noch auf das Whiskerende gesetzt.

Beispiel mtcars und y-Achsen zu zeigen, unter Verwendung von umgekehrt:

library(ggplot2,dplyr) 

    mtcars %>% 
    select(qsec, cyl,am) %>% 

    ggplot(aes(factor(cyl),qsec,fill=factor(am))) + 
    stat_boxplot(geom = "errorbar") + ## Draw horizontal lines across ends of whiskers 
    geom_boxplot(outlier.shape=1, outlier.size=3, 
       position = position_dodge(width = 0.75)) + 
    scale_y_reverse() + 
    geom_text(data = mtcars %>% 
       select(qsec,cyl,am) %>% 
       group_by(cyl, am) %>% 
       summarize(min_qsec = min(qsec),Count = n(),med = median(qsec), 
          q1 = quantile(qsec,0.25), 
          q3 = quantile(qsec,0.75), iqr = IQR(qsec), 
          qsec = mean(qsec), 
          lab_pos = max(min_qsec, q1-1.5*iqr)), 
       aes(y=lab_pos,label = Count), position = position_dodge(width = 0.75)) 

Welche produziert:

enter image description here

Die Etiketten für am(1) bei cyl(4) und am(0) bei cyl(8) falsch ausgerichtet sind.

Ist meine Berechnung für lab_pos inkorrekt oder gibt es einen besseren Ansatz zum Positionieren von Beschriftungen an den Whisker-Enden, unabhängig von Ausreißern? Ich möchte es erreichen ggplot2 und dplyr verwenden, wenn möglich

+0

Sieht so aus, als ob sich die Schnurrhaare bis zu den äußersten Punkten innerhalb des oberen oder unteren Zauns erstrecken (Q1/Q3 -/+ 1,5 * IQR). Sie sollten in der Lage sein, die Position dieser Punkte zu berechnen, obwohl Sie dies wahrscheinlich außerhalb der ggplot aes-Anweisungen tun müssen. –

+0

Das ist, was ich mit der lab_pos-Variable berechnen (oder zu berechnen versuche). Es sollte das Ende des Whiskers als lab_pos setzen, wenn der Maximalwert ein Ausreißer ist – JLC

Antwort

1

Wenn ich richtig verstehe, das ist, was Sie wollen:

label_data <- mtcars %>% 
    select(qsec, cyl, am) %>% 
    group_by(cyl, am) %>% 
    summarize(min_qsec = min(qsec), 
      Count = n(), 
      med = median(qsec), 
      q1 = quantile(qsec, 0.25), 
      q3 = quantile(qsec, 0.75), 
      iqr = IQR(qsec), 
      lab_pos = min(ifelse(qsec > q1-1.5*iqr, qsec, NA), na.rm = TRUE), 
      qsec = mean(qsec)) 

mtcars %>% 
    select(qsec, cyl,am) %>% 
    ggplot(aes(factor(cyl),qsec,fill=factor(am))) + 
    stat_boxplot(geom = "errorbar") + ## Draw horizontal lines across ends of whiskers 
    geom_boxplot(outlier.shape=1, outlier.size=3, 
       position = position_dodge(width = 0.75)) + 
    scale_y_reverse() + 
    geom_text(data = label_data, aes(y = lab_pos,label = Count), 
      position = position_dodge(width = 0.75), vjust = 0, fontface = "bold") 

enter image description here

Die Whisker im Zaun zu dem am weitesten entfernten Punkt erweitern nicht der Zaun selbst.

+0

Das funktioniert perfekt! Vielen Dank! – JLC

Verwandte Themen