如何获取两个RasterLayer的最小SIF值并区分其来自VPD还是SM?
解决方案
要实现提取两个栅格的最小SIF值并区分来源,核心是在计算最小值的同时,记录每个单元格最小值对应的原始图层(VPD/SM)。以下是基于terra(推荐替代raster的现代包)和raster包的具体实现步骤:
方法一:使用terra包(推荐)
步骤1:加载包并合并栅格
library(terra) # 合并两个对齐后的栅格为多层对象,命名以便区分 sif_stack <- c(sif_min_vpd, sif_min_sm_aligned) names(sif_stack) <- c("VPD_SIF", "SM_SIF")
步骤2:计算最小SIF值+确定来源
# 提取每个单元格的最小SIF值 min_sif <- min(sif_stack) # 创建来源标识栅格:1代表来自VPD,2代表来自SM source_raster <- which.min(sif_stack) # 将数值标签转换为文字描述 source_raster <- classify(source_raster, rbind(c(1, "VPD"), c(2, "SM")))
步骤3:可视化(区分来源+显示SIF值)
你可以分开绘制两个栅格,或者结合为一张图:
# 分图展示 par(mfrow = c(1, 2)) plot(min_sif, main = "最干旱月份最小SIF值") plot(source_raster, main = "最小值来源", col = c("#1f77b4", "#ff7f0e")) # 结合ggplot2绘制复合图(同时显示值和来源) library(ggplot2) df <- as.data.frame(min_sif, xy = TRUE) df$source <- as.data.frame(source_raster)[,1] ggplot(df, aes(x = x, y = y, fill = source, color = min_sif)) + geom_raster() + scale_fill_manual(values = c("VPD" = "#1f77b4", "SM" = "#ff7f0e"), name = "来源") + scale_color_viridis_c(name = "SIF值") + labs(title = "最干旱月份最小SIF值及来源") + coord_equal()
方法二:使用raster包
如果习惯使用旧版raster包,逻辑完全一致:
library(raster) # 合并为栅格栈 sif_stack <- stack(sif_min_vpd, sif_min_sm_aligned) names(sif_stack) <- c("VPD_SIF", "SM_SIF") # 计算最小值和来源 min_sif <- min(sif_stack) source_raster <- which.min(sif_stack) source_raster <- reclassify(source_raster, c(1,1,"VPD", 2,2,"SM")) # 可视化方式同terra,仅需将plot适配raster语法即可
关键说明
which.min()函数会返回每个单元格最小值所在的图层索引,这是区分来源的核心;- 转换为文字标签后,可视化时可以通过颜色映射直接区分VPD/SM来源;
- 最终你会得到两个栅格:
min_sif存储最小SIF值,source_raster存储对应来源,两者单元格一一对应。
内容的提问来源于stack exchange,提问作者Shunrei
相关产品推荐
相关产品推荐

