2012-03-21 40 views
10

Tengo problemas con algunos valores atípicos que hacen que la escala de colores sea inútil.ggplot2 Escala de color más afectada por valores atípicos

Mis datos tienen una variable de longitud que se basa en un rango, pero generalmente tendrá algunos valores mucho más grandes. Los siguientes datos de ejemplo tienen 95 valores entre 500 y 1500, y 5 valores superiores a 50,000. Las leyendas de colores resultantes tienden a usar 10k, 20k, ... 70k para los cambios de color cuando quiero ver cambios de color entre 500 y 1500. En realidad, cualquier cosa de alrededor de 1300 debe ser del mismo color sólido (probablemente mediana +/- enojada)), pero no sé dónde definir eso.

Estoy abierto a cualquier solución ggplot, pero idealmente los valores más bajos serían rojo, blanco medio y azul más alto (bajo es malo). En mi propio conjunto de datos, la fecha es una fecha real con as.POSIXct() en ggplot aes(), pero no parece afectar el ejemplo.

#example data 
date <- sample(x=1:10,size=100,replace=T) 
stateabbr <- sample(x=1:50,size=100,replace=T) 
Length <- c(sample(x=500:1500,size=95,replace=T),60000,55000,70000,50000,65000) 
x <- data.frame(date=date,stateabbr=stateabbr,Length=Length) 

#main plot 
(g <- ggplot(data=x,aes(x=date,y=factor(stateabbr))) + 
    geom_point(aes(color=as.numeric(as.character(Length))),alpha=3/4,size=4) + 
    #scale_x_datetime(labels=date_format("%m/%d")) + 
    opts(title="Date and State") + xlab("Date") + ylab("State")) 

#problem 
g + scale_color_gradient2("Length",midpoint=median(x$Length)) 

Adición de trans = "log" o "sqrt" no acaba de hacer el truco tampoco.

¡Gracias por tu ayuda! ?

+0

mi solución ha sido utilizar una escala de registro (o algo así) para colorear cuando tengo valores atípicos. Sin embargo, me encantaría saber si hay una mejor manera. – Justin

+0

Sí, lo había intentado, pero todavía está apagado para este ejemplo. ¡Ojalá surja una mejor manera! – ARobertson

+0

Puedes usar? Cut, para crear otra variable para tus breaks preferidos y luego establecer la estética 'color =' en esa variable. –

Respuesta

8

Aquí está uno opciones poco complicado:

#Create a new variable indicating the unusual values 
x$Length1 <- "> 1500" 
x$Length1[x$Length <= 1500] <- NA 

#main plot 
# Using fill - tricky! 
g <- ggplot() + 
    geom_point(data = subset(x,Length <= 1500), 
      aes(x=date,y=factor(stateabbr),color=Length),size=4) + 
    geom_point(data = subset(x,Length > 1500), 
      aes(x=date,y=factor(stateabbr),fill=Length1),size=4)+ 
    opts(title="Date and State") + xlab("Date") + ylab("State") 

#problem 
g + scale_color_gradient2("Length",midpoint=median(x$Length)) 

enter image description here

Así que la parte difícil aquí es utilizar fill en puntos, con el fin de convence a ggplot para hacer otra leyenda. Obviamente puede personalizar esto con diferentes etiquetas y colores para la escala de relleno.

Una cosa más, leyendo la respuesta de Brandon. En principio, podría combinar ambos enfoques tomando los valores periféricos, usando cut para crear una variable categórica separada para ellos, y luego usar mi truco con la escala fill. De esta forma, podría indicar múltiples grupos de puntos periféricos.

6

Desde mi comentario, véase cortar

x$colors <- cut(x$Length, breaks=c(0,500,1000,1300,max(x$Length))) 

g <- ggplot(data=x,aes(x=date,y=factor(stateabbr),color=colors)) + 
    geom_point() + 
    opts(title="Date and State") + 
    xlab("Date") + 
    ylab("State") 
+0

En este caso, tendría que suministrar colores de "aspecto continuo" a una variable discreta con scale_color_manual, ¿verdad? Obtengo coloración discreta, lo cual no está mal, solo una observación. – ARobertson

+0

Sí, para adaptarse a su pregunta original (rojo -> blanco -> azul). Pruebe algo como + scale_colour_manual (values ​​= c ("red", "white", "blue")). Consulte aquí para obtener más paletas efectivas: http://learnr.wordpress.com/2009/04/15/ggplot2-calalitative-colour-palettes/ Creo que la designación de paletas de espacio de color probablemente se adapte mejor a su necesidad. Solo recuerda que necesitas un color para cada descanso que crees con corte. No es difícil simularlo, por lo que parece "continuo", con un poco de uso inteligente de la paleta. –

+0

¡Suena bien, gracias! – ARobertson

3

Deshágase de los valores atípicos. Rápido y sucio, lo sé, pero creo que valió la pena decirlo. Siempre puedes describirlos en tu texto. ¿Por qué dejarlos arruinar sus análisis y gráficos?

Hay un documento de referencia en esta entrada del blog que se ocupa de vista ético la eliminación de valores atípicos:

http://psuc2f.wordpress.com/2011/10/14/is-it-dishonest-or-unethical-to-remove-outliers/

Otra manera simple de tratar con ellos sería para coronar ellos:

df $ Valor [df $ Valor> 1300] = 1300

Nuevamente, puede describir que lo hizo en el texto o incluso simplemente editar la escala para decir 1300+ en vez de 1300

Cuestiones relacionadas