2010-11-30 27 views
13

Estoy creando algunos mapas a partir de archivos ráster utilizando el paquete "ráster" en R. Me gustaría crear rásteres de comparación, mostrando varios mapas uno al lado del otro. Es importante para esto que las escalas de color utilizadas sean las mismas para todos los mapas, independientemente de los valores en cada mapa. Por ejemplo, si el mapa 1 tiene valores de 0-1, y el mapa 2 tiene valores de 0-0.5, las celdas con un valor de 0.5 deben tener el mismo color en ambos mapas.¿Cómo puedo crear gráficos ráster con la misma escala de color en R

Por ejemplo:

  • mapa 1 tiene valores de 0 a 1
  • mapa 2 tiene valores de 0 a 0,5
  • el color va de rojo (el más bajo) a verde (el más alto)

Me gustaría un valor de 0.5 para tener el mismo color en ambos mapas (es decir, amarillo, como a medio camino entre el rojo y el verde). El comportamiento actual es que es amarillo en el mapa 1, y verde en el mapa 2.

No puedo encontrar la manera de hacerlo funcionar. No veo ninguna manera de establecer el rango de valores de píxeles para usar con la función de trazado. setMinMax() no ayuda (ya que 'plot' siempre calcula los valores). Incluso intentar establecer los valores a mano (por ejemplo, g1 @ data @ max < - 10) no funciona (estos se ignoran al trazar).

Por último, hacer una pila de los mapas (que se podría esperar que tracen todo en la misma escala de color) tampoco funciona: cada mapa tiene su propia escala de colores.

¿Alguna idea sobre cómo hacer esto?

EDIT:

La solución Terminé usando es:

plot(d, col=rev(rainbow(99, start=0,end=1)), breaks=seq(min(minValue(d)),max(maxValue(d)),length.out=100)) 
+0

la solución que terminaste usando es en realidad la mejor respuesta. ¡Por favor póngalo como una respuesta y acepte! Casi lo extraño, no busco la respuesta en una pregunta. – TMS

+1

'spplot' muestra un' RasterStack' con una leyenda global para todas las capas. El paquete 'raster' define un método para' spplot', por lo que no necesita convertir su 'RasterStack' en un objeto' Spatial * 'para usarlo. –

Respuesta

7

Dado que la función de imagen :: trama especifica que los argumentos de la imagen :: bases se pueden pasar (y sugiere que la imagen :: base probablemente se use), ¿no especificarías el mismo col = y rompe = argumentos para todas las llamadas a image :: raster? Usted do necesita para obtener los saltos y los argumentos col "en sincronía". El número de colores debe ser uno menos que el número de descansos. El siguiente ejemplo se basa en los datos volcán clásico y la segunda versión muestra como un rango de valores puede ser excluido de una imagen:

x <- 10*(1:nrow(volcano)) 
y <- 10*(1:ncol(volcano)) 
image(x, y, volcano, col = terrain.colors(length(seq(90, 200, by = 5))-1), axes = FALSE, breaks= seq(90, 200, by = 5)) 
axis(1, at = seq(100, 800, by = 100)) 
axis(2, at = seq(100, 600, by = 100)) 
box() 
title(main = "Maunga Whau Volcano", font.main = 4) 



x <- 10*(1:nrow(volcano)) 
y <- 10*(1:ncol(volcano)) 
image(x, y, volcano, col = terrain.colors(length(seq(150, 200, by = 5))-1), axes = FALSE, breaks= seq(150, 200, by = 5)) 
axis(1, at = seq(100, 800, by = 100)) 
axis(2, at = seq(100, 600, by = 100)) 
box() 
title(main = "Maunga Whau Volcano Restricted to elevations above 150", font.main = 4) 

Un ejemplo específico ayudaría a este esfuerzo.

+0

¡Eso es perfecto, muchas gracias! Terminé haciendo un diagrama (d, col = rev (arco iris (99, inicio = 0, final = 1)), breaks = seq (mínimo (minValue (d)), máximo (maxValue (d)), length.out = 100)) (lo siento, parece que no se puede formatear en los comentarios!) –

+0

Edite su pregunta y guarde su solución para la posteridad. Puede ser útil algún día. –

4

Hay más trabajo que hacer aquí en 'trama', pero aquí es un truco:

library(raster) 
r1 <- r2 <- r3 <- raster(ncol=10, nrow=10) 
r1[] <- runif(ncell(r1)) 
r2[] <- runif(ncell(r2))/2 
r3[] <- runif(ncell(r3)) * 1.5 
r3 <- min(r3, 1) 
s <- stack(r1, r2, r3) 


brk <- c(0, 0.25, 0.5, 0.75, 1) 
par(mfrow=c(1,3)) 
plot(r1, breaks=brk, col=rainbow(4), legend=F) 
plot(r1, breaks=brk, col=rainbow(4), legend.only=T, box=F) 
plot(r2, breaks=brk, col=rainbow(4), legend=F) 
plot(r1, breaks=brk, col=rainbow(4), legend.only=T, box=F) 
plot(r3, breaks=brk, col=rainbow(4), legend=F) 
plot(r1, breaks=brk, col=rainbow(4), legend.only=T, box=F) 

También puede utilizar la función spplot (paquete sp)

s <- stack(r1, r2, r3) 
sp <- as(s, 'SpatialGridDataFrame') 
spplot(sp) 

También puede envíe los valores a ggplot (busque en los archivos r-sig-geo ejemplos) Si su RasterLayer se vincula a un archivo muy grande, primero puede hacerlo, antes de ir a ggplot

r <- sampleRegular(r, size=100000, asRaster=TRUE) 

y entonces tal vez

m <- as.matrix(r) 
3

añadido como una respuesta en respuesta a @Tomas

La respuesta Terminé usando es:

plot(d, col=rev(rainbow(99, start=0,end=1)), 
    breaks=seq(min(minValue(d)),max(maxValue(d)),length.out=100)) 
1

No funcionó para mí. He utilizado esta secuencia de comandos para dividir la escala de color y seleccionar el más adecuado de acuerdo con los datos de mi:

plot(d, col=rev(heat.colors(8, alpha = 1)), breaks = seq(0, 0.40, by = 0.05)) 
1

solución fácil ahora es utilizar la opción zlim.

plot(d, col=rev(rainbow(99, start=0,end=1)),zlim=c(0,1)) 
Cuestiones relacionadas