Zeichnen eines Rasterstapels mit ggplot2

Oct 25 2020

Mein Ziel ist es, mit ggplot2 einen Rasterstack als Einzelbild zu zeichnen. Zuerst wende ich mich ggplotmit dem folgenden Code auf ein Raster mit einer Ebene an:

#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)

Jetzt bewerbe ich mich gglpot()

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

Es wird erfolgreich gedruckt. Jetzt erstelle ich einen Rasterstapel mit 10 Ebenen und nenne das 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)

Wie könnte ich diesen Stapel mit zeichnen ggplot2? Erstelle ich einen data.frame, aber wie gebe ich dann ein Füllargument in aes()und ein facet_wrap()?

Antworten

3 Liman Oct 26 2020 at 02:20

Sie können scale_fill_gradientndie Füllung angeben und facet_wrapsollten die Farben von dort auswählen:

  1. Wenn Sie ein rasterVisPaket installiert haben, können Sie gplotdas ggplotObjekt mit der Funktion erstellen
library(rasterVis)
gplot(ndvi) + 
  geom_tile(aes(fill = value)) +
  facet_wrap(~ variable) +
  scale_fill_gradientn(colours = rev(terrain.colors(225))) +
  coord_equal()
  1. Andernfalls können Sie die Daten selbst erstellen, was im Grunde die gplotFunktion ist
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()