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
Fertig - und danke @ Paul-Shuvo! –