2017-05-23 6 views
2

Haben Sie eine Idee, wie Sie Jitter nur auf die Ausreißerdaten eines Boxplot anwenden können? Dies ist der CodeWenden Sie Jitter auf Ausreißerdaten in einem Boxplot mit ggplot2 an

ggplot(data = a, aes(x = "", y = a$V8)) + geom_boxplot(outlier.size = 
0.5)+ geom_point(data=a, aes(x="", y=a$V8[54]), colour="red", size=3) + 
theme_bw() +coord_flip() 

danke !!

+1

Können Sie uns ein reproduzierbares Beispiel geben? –

Antwort

3

Ihr Datensatz wurde um einen Vektor ergänzt, der anzeigt, welche Punkte Ausreißer sind und nicht. Setzen Sie dann geom_boxplot, um keine Ausreißer zu plotten, und verwenden Sie geom_point, um die Ausreißer explizit zu plotten.

Ich werde den diamonds Datensatz von ggplot2 zur Veranschaulichung verwenden.

library(ggplot2) 
library(dplyr) 

diamonds2 <- 
    diamonds %>% 
    group_by(cut) %>% 
    mutate(outlier = price > median(price) + IQR(price) * 1.5) %>% 
    ungroup 

ggplot(diamonds2) + 
    aes(x = cut, y = price) + 
    geom_boxplot(outlier.shape = NA) + # NO OUTLIERS 
    geom_point(data = function(x) dplyr::filter_(x, ~ outlier), position = 'jitter') # Outliers 

enter image description here

+0

Ich habe noch nie eine Funktion im Argument 'data =' gesehen; Das ist hervorragend! – Brian

+0

der standard für den ausreißer ist ein wenig aus, so dass die punkte die whiskers überlappen ... verwenden: 'outlier.high = V8> quantil (V8, .75) + 1.50 * IQR (V8)' und 'outlier.low = V8

2

Diese als oben etwas anderen Ansatz ist (weist eine Farbvariable mit NA für nicht Ausreißer), und enthält eine Korrektur für die oberen und unteren Grenzen Berechnungen.

Die Standarddefinition "Ausreißer" ist ein Punkt jenseits des 25/75. Quartils +/- 1,5 x des Interquartilbereichs (IQR).

erzeugen einige Beispieldaten:

set.seed(1) 
a <- data_frame(x= factor(rep(1:4, each = 1000)), 
       V8 = c(rnorm(1000, 25, 4), 
         rnorm(1000, 50, 4), 
         rnorm(1000, 75, 4), 
         rnorm(1000, 100, 4))) 

berechnet das obere/untere Grenze Ausreißer (verwendet dplyr/tidyverse Funktionen):

library(tidyverse) 
a <- a %>% group_by(x) %>% 
    mutate(outlier.high = V8 > quantile(V8, .75) + 1.50*IQR(V8), 
     outlier.low = V8 < quantile(V8, .25) - 1.50*IQR(V8)) 

eine Farbe definieren für die oberen/unteren Punkte:

Die nicht klassifizierten Fälle werden als "NA" für Farbe, a codiert nd erscheint nicht in der Handlung.

Die dplyr::case_when() Funktion ist nicht vollständig stabil noch, so ist hier eine Basis Alternative (kann Github Entwicklungsversion> 0,5 bei enter link description here erforderlich), wenn das nicht funktioniert:

a$outlier.color <- NA 
a$outlier.color[a$outlier.high] <- "red" 
a$outlier.color[a$outlier.low] <- "steelblue" 

Grundstück:

a %>% ggplot(aes(x, V8)) + 
    geom_boxplot(outlier.shape = NA) + 
    geom_jitter(color = a$outlier.color, width = .2) + # NA not plotted 
    theme_bw() + coord_flip() 

enter image description here

Verwandte Themen