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

标签 r raster

我已经浏览了所有内容,但无法找到这个特定问题的答案:

我有一个包含多个层的 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消失了!

最佳答案

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

我可能是一个解决方法,它当然不是很优雅,但它有效:

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

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

我还编辑了一些图例标签规范,因为默认值就可以了。

关于r - 如何为 rasterStack 中的所有栅格图层显示相同的图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42673376/

相关文章:

R:沿时间线计算每个单元格中的 Pearson 相关系数

r - 如何有效地计算 R 中列表中的匹配项?

r - R是编译语言吗?

r - 将 rvest 管道应用于数据框

R 栅格乘法 - 为什么栅格大小大幅增加

R - 不带框的绘图栅格

r - 在 tmap 中绘制山体阴影

r - 如何在 R 中有条件地粘贴因子标签

r - R 中的 xtable : Cannot get rid of row numbers

c# - 无法在 .NET 中使用 C# 创建可缩放的 png 图像