Etiquetado de valores atípicos de Boxplots en R

Tengo el código que crea un diagtwig de caja, usando ggplot en R, quiero etiquetar mis valores atípicos con el año y la batalla.

Aquí está mi código para crear mi diagtwig de caja

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

¿Alguien puede ayudar? Sabía que esto es correcto, solo quiero etiquetar los valores atípicos.

La siguiente es una solución reproducible que utiliza dplyr y el conjunto de datos mtcars de mtcars .

Recorrer el código: primero, cree una función, is_outlier que devolverá un booleano TRUE/FALSE si el valor que se le pasa es un valor atípico. Luego realizamos el “análisis / verificación” y group_by los datos – primero group_by nuestra variable ( cyl en este ejemplo, en su ejemplo, esto sería PortugesOutcome ) y agregamos un outlier variable en la llamada para mutate (si el drat la variable es un valor atípico [observe que esto corresponde a RatioPort2Dutch en su ejemplo], pasaremos el valor de drat , de lo contrario, devolveremos NA para que el valor no se represente). Finalmente, geom_text los resultados y geom_text valores de texto a través de geom_text y una etiqueta estética igual a nuestra nueva variable; Además, compensamos el texto (deslízalo un poco hacia la derecha) con hjust para que podamos ver los valores al lado, en lugar de sobre los puntos atípicos.

 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

¿Esto funciona para tí?

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

ggplot define un valor atípico por defecto como algo que es> 1.5 * IQR desde los bordes del cuadro.

 #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

Para etiquetar los valores atípicos con rownames (basado en la respuesta de Jason Aizkalns )

 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 con nombre de outliers

Con un pequeño giro en la solución @JasonAizkalns puede etiquetar valores atípicos con su ubicación en su dataframe.

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

Cargué el dataframe en el Entorno de estudio R, de modo que puedo ver más de cerca los datos en filas atípicas.