2011-08-28 35 views
10

Soy un novato ggplot2. Estoy haciendo un diagrama de dispersión donde los puntos se colorean en base a una tercera variable continua. Sin embargo, para algunos de los puntos, esa variable continua tiene un valor Inf o un NaN. ¿Cómo puedo generar una escala continua que tenga un color especial separado para Inf y otro color separado para NaN?Combina una escala de color continua y discreta en ggplot2?

Una forma de obtener este comportamiento es subconjunto de los datos y crear una capa separada para los puntos especiales donde se establece el color. Pero me gustaría que los colores especiales también ingresen a la leyenda, y creo que sería más claro eliminar la necesidad de subconjuntos de datos.

Gracias! Uri

Respuesta

12

Estoy seguro de que esto se puede hacer más eficiente, pero este es un enfoque. Esencialmente, seguimos su consejo de subdividir los datos en las diferentes partes, dividir los datos continuos en contenedores discretos, luego volver a unir todo y utilizar una escala de nuestra propia elección.

library(ggplot2) 
library(RColorBrewer) 

#Sample data 
dat <- data.frame(x = rnorm(100), y = rnorm(100), z = rnorm(100)) 
dat[sample(nrow(dat), 5), 3] <- NA 
dat[sample(nrow(dat), 5), 3] <- Inf 

#Subset out the real values 
dat.good <- dat[!(is.na(dat$z)) & is.finite(dat$z) ,] 
#Create 6 breaks for them 
dat.good$col <- cut(dat.good$z, 6) 

#Grab the bad ones 
dat.bad <- dat[is.na(dat$z) | is.infinite(dat$z) ,] 
dat.bad$col <- as.character(dat.bad$z) 

#Rbind them back together 
dat.plot <- rbind(dat.good, dat.bad) 

#Make your own scale with RColorBrewer 
yourScale <- c(brewer.pal(6, "Blues"), "red","green") 

ggplot(dat.plot, aes(x,y, colour = col)) + 
    geom_point() + 
    scale_colour_manual("Intensity", values = yourScale) 

enter image description here

+0

¿Por qué 'dat $ col [is.finite (dat $ z)] <- corte (dat $ z [is.finite (dat $ z)], 6)' no logran ¿trabajo? En lugar de obtener etiquetas de intervalo, acabo de obtener enteros ... –

+0

@Uri - Me encontré con el mismo problema y por lo tanto, fui por el camino de separar los valores "buenos" de los malos, y luego volver a unirlos al final. Supongo que es porque cuando tratas de hacerlo de una vez, los factores se convierten a su equivalente numérico ... aunque no pasé tanto tiempo tratando de forzarlo a trabajar porque la solución que encontré funcionó . – Chase

Cuestiones relacionadas