Vẽ một ngăn xếp raster với ggplot2
Oct 25 2020
Mục đích của tôi là vẽ một dải băng dưới dạng một hình ảnh duy nhất bằng cách sử dụng ggplot2. Đầu tiên, tôi áp dụng ggplottrên một lớp raster bằng cách sử dụng mã sau:
#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)
Bây giờ tôi áp dụng gglpot()
ggplot(data = rdf)+
geom_raster(mapping=aes(x=x, y=y, fill=magnitude))+
scale_fill_gradientn(colours= rev(terrain.colors(10)), name='Magnitude')
Nó in thành công. Bây giờ tôi tạo một ngăn xếp raster với 10 lớp và gọi nó 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)
Làm thế nào tôi có thể vẽ ngăn xếp này bằng cách sử dụng ggplot2? Tôi có tạo data.frame nhưng sau đó làm cách nào để cung cấp đối số điền vào aes()và facet_wrap()?
Trả lời
3 Liman Oct 26 2020 at 02:20
Bạn có thể sử dụng scale_fill_gradientnđể chỉ định màu tô và facet_wrapnên chọn các màu từ đó:
- Nếu bạn đã
rasterViscài đặt gói, bạn có thể sử dụnggplothàm để tạoggplotđối tượng
library(rasterVis)
gplot(ndvi) +
geom_tile(aes(fill = value)) +
facet_wrap(~ variable) +
scale_fill_gradientn(colours = rev(terrain.colors(225))) +
coord_equal()
- Nếu không, bạn có thể tự mình xây dựng dữ liệu, đây là cơ sở mà
gplothàm thực hiệ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()