2017-03-08 73 views
1

我经历都这么看了,但一直没能找到一个答案,这个具体的问题显示所有栅格图层相同的传说:如何在rasterStack

我有好几层,其a rasterStack值涵盖了一个相当大的范围。知道每个图层的值和选定的色阶我相信我已经设计出了所有具有相同色阶的光栅,但我现在面临三个问题:

  1. 我不能确定这些值是被绘制为相同的色阶,虽然它看起来像它
  2. 我无法设法绘制所有图层的相同比例和比例标签。
  3. 我的一个细胞在ras3中, ras3[3,9]没有变色,但它不是NA!

示例脚本如下:

library(raster) 
# generate example rasters 
set.seed(123) 
ras1 <- raster(ncol = 10, nrow= 10) 
values(ras1) <- runif(100, 1, 10) 

ras2 <- raster(ncol = 10, nrow = 10) 
values(ras2) <- runif(100, 5, 50) 

ras3 <- raster(ncol = 10, nrow = 10) 
values(ras3) <- runif(100, 10, 100) 

# stack them 
rasStack <- stack(ras1, ras2, ras3) 
# plot normally to check the values 
plot(rasStack) 

# obtain max and min values 
maxv <- max(maxValue(rasStack))+1 
minv <- min(minValue(rasStack)) 

# set the breaks between min and max values 
brks <- seq(minv,maxv,by=0.1) 
nbrks <- length(brks)-1 
r.range <- c(minv, maxv) 

# generate palette 
colfunc<-colorRampPalette(c("springgreen", "royalblue", "yellow", "red")) 

# plot in a loop with a common legend, using legend.only = T  
for(i in seq_len(nlayers(rasStack))){ 
    tmp <- rasStack[[i]] 
    plot(tmp, breaks=brks,col=colfunc(nbrks), legend = F, zlim=c(minv,maxv), 
    main = names(tmp)) 
    plot(tmp, legend.only=TRUE, col=colfunc(nbrks), 
     legend.width=1, legend.shrink=0.75, 
     axis.args=list(at=seq(minv, maxv, 5), 
        labels=round(seq(r.range[1], r.range[2], 5), 2), 
        cex.axis=0.6), 
    legend.args=list(text='value', side=4, font=2, line=2.5, cex=0.8))} 

# check that the blank cell has a valid value 
ras3[3, 9] 
> 99.01704 

任何帮助将不胜感激!


编辑:根据ycw的回答我编辑了代码,现在问题没有。 3消失了!

回答

1

我刚刚解决了这个问题,所以我会发布解决方案,以防其他人绊倒这个。

我可能会有点一种解决办法,它肯定是不是很优雅,但它的工作原理:

所有我们在一个新的

rasTot <- ras1 + ras2 + ras3

加起来所有三个光栅层的一

现在我们从前面的代码运行循环,但在legend.only调用的情节中,我们使用这个总的栅格。

for(i in seq_len(nlayers(rasStack))){ 
    tmp <- rasStack[[i]] 
    plot(tmp, breaks=brks,col=colfunc(nbrks), legend = F, zlim=c(minv,maxv), 
    main = names(tmp)) 
    plot(rasTot, legend.only=TRUE, col=colfunc(nbrks), 
     legend.width=1, legend.shrink=0.75, 
     legend.args=list(text='value', side=4, font=2, line=2.5, cex=0.8)) 
} 

我也编辑了一些图例标签规格,因为默认值是OK。

1

最后一个中断号应该大于数据的最大值(maxv),以便可以根据最后一个颜色类别对具有最大值的单元格进行着色。否则,单元格会变成空白。

我通过更改maxv <- max(maxValue(rasStack)) + 1来修改代码,但未更改其他部分。结果看起来不错。