2016-10-23 1 views
1

Ich möchte Ausreißer in einem ggplot-Box-Plot mit dem Namen des Subjekts kennzeichnen, für das abgelegene Daten beobachtet wurden.Ausreißer-Labels falsch zugewiesen mit ggplot2 box plot

Ich habe ging durch eine einfache Funktion zu schaffen Ausreißer zu identifizieren:

is_outlier <- function(x) { 
    return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x)) 
} 

Und dann die safe_ifelse Abhilfe ifelse zu bekommen richtig mit Faktoren zu funktionieren.

safe.ifelse <- function(cond, yes, no) { 
    class.y <- class(yes) 
    if (class.y == "factor") { 
    levels.y = levels(yes) 
    } 
    X <- ifelse(cond,yes,no) 
    if (class.y == "factor") { 
    X = as.factor(X) 
    levels(X) = levels.y 
    } else { 
    class(X) <- class.y 
    } 
    return(X) 
} 

Von hier aus habe ich Daten über eine dplyr Pipeline laufen korrekt identifiziert die Plotdaten bei https://www.dropbox.com/s/2pcuuclxiqw1va1/data.csv?dl=0

library(dplyr) data<-subset(data,data$variable1!='NA')

p1<- 
    data %>% 
    group_by(season,location) %>% 
    mutate(outlier=safe.ifelse(is_outlier(variable1),subject,as.numeric(NA))) %>% 
    ggplot(aes(x=factor(season),y=variable1))+ 
    geom_boxplot()+   
    facet_wrap(~location,nrow=2)+ 
    guides(fill=FALSE)+ 
    geom_text(aes(label=outlier),na.rm=TRUE,hjust=1.5,size=2.5) 

Während Ausreißer zu produzieren sind, die Kennzeichnung nicht, wie es sollte funktioniert . Anstatt objektspezifische Ausreißerbezeichnungen zu erhalten, werden drei Ebenen des subject Faktors wiederholt und fehlerhaft (und scheinbar zufällig) gedruckt. Das Auszeichnen von Ausreißern durch ihre numerischen Werte (d. H. Durch Ändern von subject zu variable1 in der safe_ifelse-Funktion) verursacht keine Probleme.

Ich nehme an, ich vermisse hier etwas Offensichtliches - vielleicht könnte jemand angeben, wo ich falsch liege?

Danke, Andreas

Antwort

0

Sie benötigen, um Ihre Daten in geom_text, der Teilmenge eindeutig den Text auf den Ausreißern zu zeigen.

data <-data %>% 
    group_by(season,location) %>% 
    mutate(outlier=safe.ifelse(is_outlier(variable1),subject,as.numeric(NA))) 

p1 <- data %>% 
    ggplot(aes(x=factor(season),y=variable1))+ 
    geom_boxplot()+   
    facet_wrap(~location,nrow=2)+ 
    guides(fill=FALSE)+ 
    geom_text(data = data[!is.na(data$outlier),],aes(label=subject),hjust=1.5,size=2.5) 
+0

Fertig - und danke @ Paul-Shuvo! –