如何为 rasterStack 中的所有栅格图层显示相同的图例
How to display the same legend for all raster layers in a rasterStack
我已经查看了所有 SO,但未能找到这个特定问题的答案:
我有一个包含多个层的 rasterStack,其值跨越相当大的范围。知道每一层的值和选择的色标我相信我已经设法用相同的色标绘制所有栅格,但我现在面临三个问题:
- 我不能确定这些值是用相同的色标绘制的,尽管看起来是这样
- 我无法为所有图层绘制相同的比例和比例标签。
我在 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失踪了!
最后一个中断号应大于数据的最大值 (maxv
),以便可以根据最后一个颜色类别为具有最大值的单元格着色。否则,单元格将为空白。
我通过更改 maxv <- max(maxValue(rasStack)) + 1
修改了您的代码,但没有更改其他部分。结果看起来不错。
我刚刚解决了这个问题,所以我会 post 解决方案,以防其他人遇到这个问题。
我可能有点变通,它当然不是很优雅,但它有效:
首先,我们将所有三个栅格图层添加到一个新栅格图层中
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))
}
我还删除了一些图例标签规范,因为默认设置就可以了。
我已经查看了所有 SO,但未能找到这个特定问题的答案:
我有一个包含多个层的 rasterStack,其值跨越相当大的范围。知道每一层的值和选择的色标我相信我已经设法用相同的色标绘制所有栅格,但我现在面临三个问题:
- 我不能确定这些值是用相同的色标绘制的,尽管看起来是这样
- 我无法为所有图层绘制相同的比例和比例标签。
我在 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失踪了!
最后一个中断号应大于数据的最大值 (maxv
),以便可以根据最后一个颜色类别为具有最大值的单元格着色。否则,单元格将为空白。
我通过更改 maxv <- max(maxValue(rasStack)) + 1
修改了您的代码,但没有更改其他部分。结果看起来不错。
我刚刚解决了这个问题,所以我会 post 解决方案,以防其他人遇到这个问题。
我可能有点变通,它当然不是很优雅,但它有效:
首先,我们将所有三个栅格图层添加到一个新栅格图层中
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))
}
我还删除了一些图例标签规范,因为默认设置就可以了。