2011-10-28 21 views
5

Quiero dibujar boxplots en R y agregar nombres a valores atípicos. Hasta ahora encontré this solution.Rotulación de etiquetas atípicas en R

La función allí proporciona toda la funcionalidad que necesito, pero codifica incorrectamente las etiquetas. En el siguiente ejemplo, que marca el valor atípico como "u" en lugar de "O":

library(plyr) 
library(TeachingDemos) 
source("http://www.r-statistics.com/wp-content/uploads/2011/01/boxplot-with-outlier-label-r.txt") # Load the function 
set.seed(1500) 
y <- rnorm(20) 
x1 <- sample(letters[1:2], 20,T) 
lab_y <- sample(letters, 20) 
# plot a boxplot with interactions: 
boxplot.with.outlier.label(y~x1, lab_y) 

¿Conoce alguna solución? La biblioteca ggplot2 es súper agradable, pero no ofrece esa funcionalidad (hasta donde yo sé). Mi alternativa es usar la función text() y extraer la información atípica del objeto boxplot. Sin embargo, así las etiquetas pueden superponerse.

Muchas gracias :-)

+2

Actualización: He traído este error a la atención de Tal Galili, y w/en horas, publicó una versión editada del guión que ya no presenta este problema. –

Respuesta

6

Me tomó un vistazo a esto con debug(boxplot.with.outlier.label), y ... resulta que hay un bug en la función.

El error se produce en la línea 125, donde el data.frame DATA se construye a partir x, y y label_name.

Anteriormente x y y se han reordenado, mientras que lab_y no ha sido enviado. Cuando el valor suministrado de x (su x1) ya no esté en orden, obtendrá el tipo de confusión que experimentó.

Como una solución inmediata, se puede pre-ordenar los x valores como este (o hacer algo más elegante)

df <- data.frame(y, x1, lab_y, stringsAsFactors=FALSE) 
df <- df[order(df$x1), ] 
# Needed since lab_y is not searched for in data (though it probably should be) 
lab_y <- df$lab_y 

boxplot.with.outlier.label(y~x1, lab_y, data=df) 

Boxplot produced by procedure described above

+0

Josh: gracias.^_^ –

+0

Gracias Josh. Me encontré con el mismo problema hace unos días, así que fue una gran ayuda +1 – pssguy

+1

Me alegro de ayudar.Dado que esto parece ser útil para otras personas, acabo de enviar un correo electrónico al autor del guión, ya que les había pedido a los usuarios que lo hicieran si encuentran errores en el guión. –

1

El intelligent point label placement es un tema aparte discuten here o here. No hay una solución definitiva e ideal, así que solo tienes que elegir una.

Así que tendría overplot el diagrama de caja normal con etiquetas, de la siguiente manera:

set.seed(1501) 
y <- c(4, 0, 7, -5, rnorm(16)) 
x1 <- c("a", "a", "b", "b", sample(letters[1:2], 16, T)) 
lab_y <- sample(letters, 20) 

bx <- boxplot(y~x1) 

out_lab <- c() 
for (i in seq(bx$out)) { 
    out_lab[i] <- lab_y[which(y == bx$out[i])[1]] 
} 

identify(bx$group, bx$out, labels = out_lab, cex = 0.7) 

Luego, durante el identify() está en funcionamiento, basta con hacer clic en la posición en la que desea la etiqueta, tal como se describe here. Cuando termine, simplemente presione "STOP". ¡Tenga en cuenta que cada valor atípico puede tener más de una etiqueta! En mi solución, ¡simplemente elegí el primero!

PS: Me siento avergonzado por el bucle, pero no saben cómo vectorizar que - no dude en publicar una mejora.

EDIT: inspirado en el Federico's link ahora veo que se puede hacer mucho más fácil! Sólo estos 2 comandos:

boxplot(y~x1) 
identify(as.integer(as.factor(x1)), y, labels = lab_y, cex = 0.7) 
+1

La solución de identificación() es agradable, pero no es escalable, tengo cientos de gráficos y tengo que imprimirlos en formato PDF :-) –

Cuestiones relacionadas