Ggplot2 ile bir raster yığını çizme

Oct 25 2020

Amacım, ggplot2 kullanarak bir rasterstack'i tek bir resim olarak çizmek. İlk olarak, ggplotaşağıdaki kodu kullanarak tek katmanlı bir raster üzerine başvuruyorum :

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

Şimdi başvuruyorum gglpot()

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

Başarıyla yazdırır. Şimdi 10 katmanlı bir raster yığını oluşturup buna diyorum 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)

Bu yığını kullanarak nasıl çizebilirim ggplot2? Bir data.frame oluşturmalı mıyım ama sonra aes()ve içinde doldurma bağımsız değişkenini nasıl sağlayabilirim facet_wrap()?

Yanıtlar

3 Liman Oct 26 2020 at 02:20

Dolguyu scale_fill_gradientnbelirtmek için kullanabilirsiniz ve facet_wraporadan renkleri seçmelisiniz:

  1. Yüklü rasterVispaketiniz varsa gplot, ggplotnesneyi oluşturmak için işlevi kullanabilirsiniz.
library(rasterVis)
gplot(ndvi) + 
  geom_tile(aes(fill = value)) +
  facet_wrap(~ variable) +
  scale_fill_gradientn(colours = rev(terrain.colors(225))) +
  coord_equal()
  1. Aksi takdirde, verileri kendiniz oluşturabilirsiniz, temelde gplotişlev ne yapar?
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()