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í:
- Si tiene un
rasterVispaquete instalado, puede usar lagplotfunción para crear elggplotobjeto
library(rasterVis)
gplot(ndvi) +
geom_tile(aes(fill = value)) +
facet_wrap(~ variable) +
scale_fill_gradientn(colours = rev(terrain.colors(225))) +
coord_equal()
- 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()