2015-11-04 18 views
8

Ho il codice che crea un boxplot, utilizzando ggplot in R, voglio etichettare i miei valori anomali con l'anno e Battaglia.Etichettatura di valori anomali di boxplot in R

Ecco il mio codice per creare il mio grafico a scatole

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") 

chiunque può aiutare? Sapevo che era corretto, voglio solo etichettare i valori anomali.

+2

dove viene dati 'seabattle' viene? Puoi 'dput' i dati o fornire dati di esempio per rendere riproducibile questo esempio? – JasonAizkalns

+0

Qualcosa che hai già provato? – Heroka

risposta

5

Funziona per voi?

library(ggplot2) 
library(data.table) 

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

ggplot definisce un outlier per impostazione predefinita come qualcosa che è> 1,5 * IQR dai confini della scatola.

#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

La seguente è una soluzione che utilizza riproducibile dplyr e il built-in mtcars set di dati.

Camminare attraverso il codice: in primo luogo, creare una funzione, is_outlier che restituirà un valore booleano TRUE/FALSE se il valore passato è un valore anomalo. Quindi eseguiamo la "analisi/verifica" e tracciamo i dati - prima noi group_by la nostra variabile (cyl in questo esempio, nel vostro esempio, sarebbe PortugesOutcome) e aggiungiamo una variabile nella chiamata a mutate (se il drat variabile è un valore anomalo [nota questo corrisponde a RatioPort2Dutch nel tuo esempio], passeremo il valore drat, altrimenti restituiremo NA in modo che il valore non sia tracciato). Infine, tracciamo i risultati e tracciamo i valori del testo tramite geom_text e un'etichetta estetica uguale alla nostra nuova variabile; inoltre, abbiamo spostato il testo (facendolo scorrere un po 'verso destra) con hjust in modo che possiamo vedere i valori accanto a, piuttosto che sopra, i punti di riferimento.

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

Con una piccola torsione su soluzione @JasonAizkalns è possibile etichettare i valori anomali con la loro posizione nel frame di dati.

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

ho caricare il frame di dati nella R Studio Ambiente, così posso poi dare un'occhiata più da vicino i dati in righe di valori anomali.

2

per etichettare i outlier con rownames (sulla base di JasonAizkalns risposta)

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

Problemi correlati