如何在rasterStack中显示所有栅格图层的相同图例

时间:2017-03-08 14:01:41

标签: r raster

我已经浏览了所有SO但未能找到这个具体问题的答案:

我有一个带有多个图层的rasterStack,其值的范围非常大。了解每一层的值和所选择的色标我相信我已设法绘制所有具有相同色阶的栅格,但我现在面临三个问题:

  1. 我不能确定这些值是用相同的色标绘制的,尽管看起来好像是
  2. 我无法为所有图层绘制相同比例和比例标注。
  3. 我在ras3 ras3[3,9]中的一个单元格没有变色,但它不是NA!
  4. 示例脚本如下:

    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已经消失了!

2 个答案:

答案 0 :(得分:2)

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

我可能是一个解决方法,它当然不是很优雅,但它的工作原理:

首先,我们将所有三个栅格图层添加到一个新的

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

我还修改了一些图例标签规范,因为默认设置是正常的。

答案 1 :(得分:1)

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

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