2012-08-29 23 views
12

preguntas que he visto algo similar a esto, pero me gustaría hacer mi pregunta específica la forma más directa posible:Transformar escala de colores, pero mantener un buen leyenda con ggplot2

Tengo un gráfico de dispersión con una "z" variables codifica en una escala de colores:

library(ggplot2) 
myData <- data.frame(x = rnorm(1000), 
        y = rnorm(1000)) 
myData$z <- with(myData, x * y) 

badVersion <- ggplot(myData, 
       aes(x = x, y = y, colour = z)) 
badVersion <- badVersion + geom_point() 
print(badVersion) 

que produce esto: bad version

Como se puede ver, ya que la variable "z" se distribuye normalmente, muy pocos de los puntos son de color con el colores "extremos" de la distribución. Esto es lo que debería ser, pero estoy interesado en enfatizar la diferencia. Una forma de hacer esto sería utilizar:

betterVersion <- ggplot(myData, 
         aes(x = x, y = y, colour = rank(z))) 
betterVersion <- betterVersion + geom_point() 
print(betterVersion) 

que produce esto: better version

Mediante la aplicación de rango() a la "z" variables, consigo un mayor énfasis en las diferencias de menor importancia dentro de la " z "variable. Uno podría imaginar el uso de cualquier transformación aquí, en lugar de rango, pero se entiende la idea.

Mi pregunta es, esencialmente, cuál es la forma más directa, o la forma más "verdadera ggplot2", de obtener una leyenda en las unidades originales (unidades de z, en oposición al rango de z), mientras se mantiene la versión transformada de los puntos de colores?

Tengo la sensación de que esto usa el reescalador() de alguna manera, pero no me queda claro cómo usar el reescalador() con transformaciones arbitrarias, etc. En general, serían útiles ejemplos más claros.

Gracias de antemano por su tiempo.

+3

+1 para un ejemplo reproducible, objetivo claro y una pregunta de visualización interesante. –

Respuesta

6

Tener un vistazo al paquete scales especialmente ?trans

Creo que una transformación que se asigna el color da la probabilidad de obtener el valor o más extrema debe ser razonable (básicamente pnorm(z))

I piense que scale_colour_continuous(trans = probability_trans(distribution = 'norm') debería funcionar, pero arroja advertencias.

Así que define una nueva transformación (ver ?trans_new)

tengo que definir una transformación y una inversa

library(scales) 
norm_trans <- function(){ 
    trans_new('norm', function(x) pnorm(x), function(x) qnorm(x)) 
} 

badVersion + geom_point() + scale_colour_continuous(trans = 'norm')) 

enter image description here

Utilizando el probability_trans suministrado lanza una advertencia y no lo hace parecen funcionar

# this throws a warning 
badVersion + geom_point+ 
    scale_colour_continuous(trans = probability_trans(distribution = 'norm')) 

## Warning message: 
## In qfun(x, ...) : NaNs produced 

enter image description here

+0

Esta es una respuesta realmente útil, gracias. La documentación del paquete de escalas para trans_new() carece de un ejemplo, así que gracias por proporcionarnos uno. También pnorm() es definitivamente la función correcta para mí. – isDotR

+0

Pero ahora tengo una nueva pregunta: por un capricho, intenté badVersion + geom_point() + scale_x_continuous (trans = 'norma'), y no funcionó.Usando badVersion + geom_point() + scale_x_continuous (trans = 'log') produce resultados. ¿Alguna idea de por qué? – isDotR

+0

Hmmmm .... Eso es interesante, lo pensaré ... quizás las escalas de los ejes se tratan de manera diferente, pero sería extraño. Es más probable que no esté entendiendo cómo funcionan las transformaciones. – mnel

Cuestiones relacionadas