2011-05-30 32 views
7

Advertencia .... pregunta muy novato sigue:crear una paleta de colores más continua en R, ggplot2, enrejado, o latticeExtra

Estoy tratando de trazar una distribución bastante regular de varios miles de puntos (x, y) cada uno asociado con un valor, llamemos Z, que varía de forma muy irregular entre, por ejemplo, -20 a +20. No estoy interesado en suavizar; Quiero que los valores del punto Z se tracen de acuerdo con una paleta de colores que varía de forma muy parecida a la que Gnuplot puede hacer con la paleta de colores suave adecuada. He intentado R base, ggplot2 y latticeExtra, y lo mejor que puedo, puedo llegar a los siguientes, que no hace casi lo que quiero:

library(lattice) 
library(latticeExtra) 
library(colorRamps) 
df = read.table(file"whatever", header=T) 
levelplot(Z~X*Y, df, panel=panel.levelplot.points, cex=0.2, 
    col.regions=colorRampPalette(c("red","white","blue"))(50)) 

un punto de datos se parece a: 1.302.525 225.167 -3,5

Cuando trazo mi dataframe con el "50" en la última línea de código como 3, obtengo el comportamiento de reciclado R predecible de los colores rojo, blanco y azul repitiendo cinco veces con el decimosexto segmento de barra de color blanco. Si se cambian los 3 a 7, se generan más tonos de rojo y azul al crear 2 segmentos de repetición de rango de color con dos colores rojizos sobrantes a medida que el rango de color intenta reciclarse. Esto sugiere que hacer este número más grande provoca una graduación de colores más fina. Pero si pongo un número mayor a 16, eso es todo lo que obtengo, 16 segmentos de colores, cambiando uniformemente de rojo, a blanco, a azul. Pero me gustaría que la escala de colores sea aún más fina, y en un mundo perfecto, forzar una Z de cero para que sea el color blanco.

Mi experiencia hasta ahora con R es que cuando no puedo hacer algo tan simple como este, me falta un concepto muy fundamental. ¿Qué es?

Respuesta

7

¿Has mirado scale_gradient en ggplot? O scale_brewer para colores discretos? Esto es un ejemplo de scale_gradient

dat <- data.frame(x = rnorm(1000), y = rnorm(1000), z = sample(-20:20, 1000, TRUE)) 

p <- ggplot(dat, aes(x, y, colour = z)) + geom_point() 
p + scale_colour_gradient() 
p + scale_colour_gradient(low = "red", high = "blue") 
p + scale_colour_gradient2(low = "red", mid = "white", high = "blue") 
+0

Gracias Chase por el impulso es esta dirección. – Plsvn

11

En lo que se refiere a celosía, puede configurar los colores de su paleta con RColorBrewer (o incluso colorspace). Usando el ejemplo proporcionado por @Chase, pero con valor positivo para z:

dat <- data.frame(x = rnorm(1000), y = rnorm(1000), z = sample(0:40, 1000, TRUE)) 
library(RColorBrewer) 
# see, e.g. 
# display.brewer.all(9, type="seq") 
# display.brewer.pal(11, "RdBu") 
my.col <- colorRampPalette(brewer.pal(11, "RdBu"))(diff(range(dat$z))) 
xyplot(y ~ x, data=dat, col=my.col[dat$z], pch=19, alpha=.5) 

Tenga en cuenta que también es necesario para aumentar la gama de colores disponibles por interpolación. Además, con levelplot(), es posible que desee jugar con cut= y pretty=.

enter image description here

6

El "concepto" se echa en falta es el argumento at-levelplot() que define los puntos de ruptura entre los niveles de color y/o líneas de contorno. El valor predeterminado es pretty(z), lo que da como resultado solo unos pocos niveles. Puede configurar at para que sea una secuencia que cubra el rango de valores que desee.

library(latticeExtra) 

dat <- data.frame(x = rnorm(1000), y = rnorm(1000), z = rnorm(1000, mean = 1)) 
## for centering the colour key around zero 
maxz <- max(abs(dat$z)) 

levelplot(z ~ x * y, dat, at = seq(-maxz, maxz, length = 100), 
    panel = panel.levelplot.points, par.settings = custom.theme.2()) 
Cuestiones relacionadas