2017-01-11 3 views
2

levelplot()으로 만든 이미지를 오버레이하고 싶습니다. 래스터의 각 패널에 16 개의 트 렐리 스 객체 목록을 오버레이하는 것은 악몽입니다. 그리드 리소스를 사용하여 맵을 개별적으로 오버레이 할 수 있지만, 나는 levelplot()의 아름다움을 선호합니다. 지도가 어떻게 실현되는지 재현 가능한 코드로 만들어 보겠습니다.범주 형 변수의 레벨 플롯을 사용하여 래스터 용 레벨 플롯 패널을 오버레이합니다.

lapply(c("raster", "rasterVis", "RColorBrewer"), require, character.only = TRUE) 
# create a rasterbrick 
my.brick <- vector("list", 16) 
for(i in 1:16){ 
    my.brick[[i]] <- raster(xmn = 30, xmx = 42, ymn = -6, ymx = 6) 
    values(my.brick[[i]]) <- runif(ncell(my.brick[[i]]), 1, 250) 
} 
my.brick <- stack(my.brick) # the rasterlayers 

cols <- c("white", brewer.pal(9, "Reds")) # my colours 
my.at <- seq(0, 250, 25) 

p1 <- levelplot(my.brick, col.regions = cols, at = my.at) # plot the raster 
coods <- vector("list", length = 16) # object to hold my point data 
my.plots <- coods # An empty list to hold trellis objects 

for(i in 1:16){ # A loop to create the spatial points 
    coods[[i]] <- data.frame(lat = runif(10, 30, 50), lon = runif(10, 0, 20), 
          val = runif(10, 1, 250)) 
    attach(coods[[i]]) ## let the headers become R objects 
    coordinates(coods[[i]]) <- ~ lon + lat # convert to a sp object. 
    my.plots[[i]] <- levelplot(val ~ lon + lat, col.regions = cols, at = my.at, 
          panel = panel.levelplot.points, cex = 1.3) + 
    layer(sp.points(coods[[i]], pch = 21, bg = "white", col = "black", 
        lwd = 2, cex = 1.5)) # Plots. The layer is meant enhance 
             # the width of the symbol outline 
} 

어떻게 래스터 플롯 p1에 대한 목록입니다 my.plots 오버레이합니까? 스택 교환에 대해 몇 가지 대답이있는 것 같지만 충분하지 못했습니다.

+0

정말 질문 제목을 모르겠습니다. 맞습니까? –

+0

청구서에 맞게이 질문의 제목을 자유롭게 조정하십시오. 감사합니다 오스카 – Joseph

답변

1

이 문제는 previous question에 게시 된 솔루션을 사용하여 해결할 수 있습니다. latticeExtra::layerpanel.number을 결합하여 사용합니다. 또한 개체 작성 프로세스를 간소화하기 위해 코드를 수정했습니다.

library(raster) 
library(rasterVis) 

## Create a RasterStack 
r <- raster(xmn = 30, xmx = 42, ymn = -6, ymx = 6) 
my.brick <- stack(lapply(1:16, FUN = function(i) 
    init(r, 
     fun = function(x) runif(x, min = 1, max = 250) 
     ))) 

## Create a list of SpatialPoints 
prj <- CRS(projection(r)) 
pts <- lapply(1:16, FUN = function(i) 
{ 
    pt <- SpatialPointsDataFrame(cbind(runif(10, 30, 42), 
             runif(10, -6, 6)), 
           data.frame(val = runif(10, 1, 250)), 
           proj4string = prj) 
})      



## Display the raster and the points 
levelplot(my.brick) + 
    layer(sp.points(pts[[panel.number()]], 
        pch = 21, bg = "white", col = "black", 
        lwd = 2, cex = 1.5)) 
+0

나는 오스카 대답을 주셔서 감사합니다. 그러나, 나는 포인트들이 정보를 그들 자신의 것으로 묘사하도록하고 싶습니다. sp.points()는 작업을 수행 할 수 있지만 크기, 색상 및 기호 유형과 같은 몇 가지 속성 만 추가하는 것으로 제한됩니다. 예를 들어, 한 장소의 온도는 위성 및 지상 방송국에서 측정 할 수 있습니다. 래스터는 위성 온도를 나타내야하며 포인트는 스테이션 온도를 나타내야합니다. 두 개가 중첩되면 유사한 색상 키를 가져야합니다. 한 번에 두 개의 레벨 플롯을 오버레이 할 수 있습니까? 감사. – Joseph

관련 문제