los - superponer graficas en r ggplot
¿Cómo puedo crear gráficos de trama con la misma escala de colores en R (5)
Agregado como respuesta en respuesta a @Tomas
La respuesta que terminé usando es:
plot( d, col=rev( rainbow( 99, start=0,end=1 ) ),
breaks=seq(min(minValue( d )),max(maxValue(d)),length.out=100) )
Estoy creando algunos mapas a partir de archivos raster utilizando el paquete "raster" en R. Me gustaría crear rásteres de comparación, mostrando varios mapas de lado a lado. 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 deberían tener el mismo color en ambos mapas.
Por ejemplo:
- El mapa 1 tiene valores de 0 a 1.
- El mapa 2 tiene valores de 0 a 0.5.
- el color va del rojo (el más bajo) al verde (el más alto)
Me gustaría que un valor de 0.5 tenga el mismo color en ambos mapas (es decir, amarillo, a mitad de camino entre rojo y verde). El comportamiento actual es que es amarillo en el mapa 1 y verde en el mapa 2.
No puedo encontrar una manera de hacer que esto funcione. No puedo ver ninguna forma 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 configurar los valores manualmente (p. Ej., G1 @ data @ max <- 10) no funciona (estos se ignoran al trazar).
Finalmente, hacer una pila de los mapas (de los que se podría esperar que dibujen todo en la misma escala de colores) tampoco funciona, ya que cada mapa tiene su propia escala de colores.
¿Alguna idea sobre cómo hacer esto?
EDITAR:
La solución que terminé usando es:
plot( d, col=rev( rainbow( 99, start=0,end=1 ) ), breaks=seq(min(minValue( d )),max(maxValue(d)),length.out=100) )
Dado que la función image :: raster especifica que los argumentos image :: base se pueden pasar (y sugiere que probablemente se use image :: base), ¿no debería especificar los mismos argumentos col = y breaks = para todas las llamadas a la imagen? :: raster? Necesitas obtener los descansos y los argumentos de la columna "en sincronización". El número de colores debe ser uno menos que el número de cortes. El siguiente ejemplo se basa en los datos del volcán clásico y la segunda versión muestra cómo se puede excluir un rango de valores 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.
Hay más trabajo por hacer aquí en ''raster'' pero aquí hay un hack:
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 enviar los valores a ggplot (busque los archivos r-sig-geo para obtener ejemplos) Si su RasterLayer se vincula a un archivo muy grande, primero debe hacerlo antes de ir a ggplot.
r <- sampleRegular(r, size=100000, asRaster=TRUE)
y entonces tal vez
m <- as.matrix(r)
La solución fácil ahora es usar la opción zlim.
plot( d, col=rev( rainbow( 99, start=0,end=1 ) ),zlim=c(0,1) )
No funciono para mí. Utilicé este script para dividir la escala de color y seleccionar la más adecuada según mis datos:
plot(d, col=rev(heat.colors(8, alpha = 1)), breaks = seq(0, 0.40, by = 0.05))