Trazar una pila de ráster con ggplot2

Oct 25 2020

Mi objetivo es trazar una pila de trama como una sola imagen usando ggplot2. Primero, aplico ggploten un ráster de una sola capa usando el siguiente código:

#Load packages
library(raster)
library(ggplot2)

#Create a random raster layer
set.seed(11)
r <- raster(nrows = 10, ncols = 10, res = 30, xmn = 267195, xmx = 267375, ymn = 4016985, ymx = 4017135)
r <- setValues(r, runif(ncell(r), min = -10000, max = 10000))
crs(r) <- "+proj=utm +zone=43 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0"
plot(r) #Produce simple plot

rdf <- as.data.frame(r, xy=TRUE) #Convert raster to data.frame
names(rdf)[3] <- 'magnitude' #Name value column
head(rdf)

Ahora aplico gglpot()

ggplot(data = rdf)+
  geom_raster(mapping=aes(x=x, y=y, fill=magnitude))+
  scale_fill_gradientn(colours= rev(terrain.colors(10)), name='Magnitude')

Imprime con éxito. Ahora creo una pila de ráster con 10 capas y llamo a esto ndvi.

rr <- lapply(1:10, function(i) setValues(r, runif(ncell(r), min = -10000, max = 10000)))
ndvi <- stack(rr)
crs(ndvi) <- "+proj=utm +zone=43 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0"
plot(ndvi)

¿Cómo podría trazar esta pila usando ggplot2? ¿Creo un data.frame pero luego cómo proporciono un argumento de relleno en aes()y facet_wrap()?

Respuestas

3 Liman Oct 26 2020 at 02:20

Puede usar scale_fill_gradientnpara especificar el relleno, y facet_wrapdebe elegir los colores desde allí:

  1. Si tiene un rasterVispaquete instalado, puede usar la gplotfunción para crear el ggplotobjeto
library(rasterVis)
gplot(ndvi) + 
  geom_tile(aes(fill = value)) +
  facet_wrap(~ variable) +
  scale_fill_gradientn(colours = rev(terrain.colors(225))) +
  coord_equal()
  1. De lo contrario, puede construir los datos usted mismo, que es básicamente lo gplotque hace la función
coords <- xyFromCell(ndvi, seq_len(ncell(ndvi)))
ndvi <- stack(as.data.frame(getValues(ndvi)))
names(ndvi) <- c('value', 'variable')

ndvi <- cbind(coords, ndvi)
ggplot(ndvi) + 
  geom_tile(aes(x, y, fill = value)) +
  facet_wrap(~ variable) +
  scale_fill_gradientn(colours = rev(terrain.colors(225))) +
  coord_equal()