2015-11-04 21 views
8

Ich habe den Code, der einen Boxplot erstellt, mit ggplot in R, ich möchte meine Ausreißer mit dem Jahr und Battle beschriften.Kennzeichnung von Ausreißern von Boxplots in R

Hier ist mein Code meine boxplot

require(ggplot2) 
ggplot(seabattle, aes(x=PortugesOutcome,y=RatioPort2Dutch),xlim="OutCome", 
y="Ratio of Portuguese to Dutch/British ships") + 
geom_boxplot(outlier.size=2,outlier.colour="green") + 
stat_summary(fun.y="mean", geom = "point", shape=23, size =3, fill="pink") + 
ggtitle("Portugese Sea Battles") 

Kann mir jemand helfen zu schaffen? Ich wusste, dass das stimmt, ich möchte nur die Ausreißer kennzeichnen.

+2

Wo Daten 'seabattle' kommen aus? Können Sie die Daten "ausgeben" oder Beispieldaten bereitstellen, um dieses Beispiel reproduzierbar zu machen? – JasonAizkalns

+0

Alles was du schon probiert hast? – Heroka

Antwort

5

Funktioniert das für Sie?

library(ggplot2) 
library(data.table) 

#generate some data 
set.seed(123) 
n=500 
dat <- data.table(group=c("A","B"),value=rnorm(n)) 

ggplot definiert einen Ausreißer standardmäßig als etwas, das von den Grenzen der Box> 1.5 * IQR ist.

#function that takes in vector of data and a coefficient, 
#returns boolean vector if a certain point is an outlier or not 
check_outlier <- function(v, coef=1.5){ 
    quantiles <- quantile(v,probs=c(0.25,0.75)) 
    IQR <- quantiles[2]-quantiles[1] 
    res <- v < (quantiles[1]-coef*IQR)|v > (quantiles[2]+coef*IQR) 
    return(res) 
} 

#apply this to our data 
dat[,outlier:=check_outlier(value),by=group] 
dat[,label:=ifelse(outlier,"label","")] 

#plot 
ggplot(dat,aes(x=group,y=value))+geom_boxplot()+geom_text(aes(label=label),hjust=-0.3) 

enter image description here

10

Das Folgende ist eine Lösung, die reproduzierbare dplyr und die eingebauten in mtcars Datensatz verwendet.

Gehen durch den Code: Erstellen Sie zuerst eine Funktion is_outlier, die einen booleschen TRUE/FALSE zurückgibt, wenn der Wert, der an es übergeben wird, ein Ausreißer ist. Wir führen dann die "Analyse/Prüfung" und zeichnen die Daten - zuerst wir group_by unsere Variable (cyl in diesem Beispiel, in Ihrem Beispiel wäre dies PortugesOutcome) und wir fügen eine Variable outlier in den Aufruf an mutate (wenn die drat10) Variable ist ein Ausreißer [beachten Sie dies entspricht RatioPort2Dutch in Ihrem Beispiel], wir werden den drat Wert übergeben, sonst werden wir NA zurückgeben, so dass der Wert nicht gezeichnet wird). Schließlich plotten wir die Ergebnisse und zeichnen die Textwerte über geom_text und eine ästhetische Bezeichnung, die unserer neuen Variablen entspricht; zusätzlich versetzen wir den Text (schieben Sie ihn ein bisschen nach rechts) mit hjust so, dass wir die Werte neben, anstatt auf den Ausreißer Punkten sehen können.

library(dplyr) 
library(ggplot2) 

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

mtcars %>% 
    group_by(cyl) %>% 
    mutate(outlier = ifelse(is_outlier(drat), drat, as.numeric(NA))) %>% 
    ggplot(., aes(x = factor(cyl), y = drat)) + 
    geom_boxplot() + 
    geom_text(aes(label = outlier), na.rm = TRUE, hjust = -0.3) 

Boxplot

-2

Mit einem kleinen Twist auf @JasonAizkalns Lösung Sie Ausreißer mit ihrem Standort in Datenrahmen beschriften können.

mtcars[,'row'] <- row(mtcars)[,1] 
... 
mutate(outlier = ifelse(is_outlier(drat), row, as.numeric(NA))) 
... 

Ich lade den Datenrahmen in die R Studio-Umgebung, so kann ich dann einen genaueren Blick auf den Daten in Ausreißer Reihen nehmen.

2

die Ausreißern mit rownames Zur Kennzeichnung (basierend auf JasonAizkalns Antwort)

library(dplyr) 
library(ggplot2) 
library(tibble) 

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

dat <- mtcars %>% tibble::rownames_to_column(var="outlier") %>% group_by(cyl) %>% mutate(is_outlier=ifelse(is_outlier(drat), drat, as.numeric(NA))) 
dat$outlier[which(is.na(dat$is_outlier))] <- as.numeric(NA) 

ggplot(dat, aes(y=drat, x=factor(cyl))) + geom_boxplot() + geom_text(aes(label=outlier),na.rm=TRUE,nudge_y=0.05) 

boxplot with outliers name

Verwandte Themen