基于terra库实现双栅格与矢量文件的配对箱线图绘制问题
解决Terra库中双栅格与矢量提取并绘制配对箱线图的问题
错误原因
你用stack()报错是因为这个函数属于raster包,无法直接处理Terra的SpatRaster对象。Terra库有自己的栅格合并方式,不需要依赖raster包。
修正方案(纯Terra实现)
步骤1:加载必要库并准备数据
移除raster包,仅保留Terra和ggplot2,用Terra自带的方法合并栅格:
# 加载库(无需raster包) library(terra) library(ggplot2) # 加载示例矢量和栅格数据 v <- vect(system.file("ex/lux.shp", package="terra")) r_current <- rast(system.file("ex/elev.tif", package="terra")) # 当前气候栅格 r_future <- rast(system.file("ex/elev.tif", package="terra")) # 未来气候栅格(示例用同一份数据,实际替换为你的文件) # 合并两个SpatRaster并命名区分 r_combined <- c(r_current, r_future) names(r_combined) <- c("current_climate", "future_climate")
步骤2:提取栅格值并关联矢量属性
Terra的extract()支持直接提取多波段/多栅格数据,返回结果会包含每个栅格的列:
# 提取双栅格值,关联矢量ID e <- extract(r_combined, v) # 关联矢量的NAME_2属性 e$NAME_2 <- v$NAME_2[e$ID]
步骤3:整理数据为长格式(适配配对箱线图)
ggplot绘制配对箱线图需要长格式数据,用tidyr::pivot_longer转换:
# 加载tidyr(如果没装先执行install.packages("tidyr")) library(tidyr) e_long <- pivot_longer(e, cols = c(current_climate, future_climate), names_to = "climate_period", values_to = "value")
步骤4:绘制配对箱线图
按行政区分组,对比当前/未来气候的分布:
ggplot(e_long, aes(x = NAME_2, y = value, fill = climate_period)) + geom_boxplot(position = position_dodge(width = 0.8)) + theme_minimal() + labs(title = "当前vs未来气候指标配对箱线图", x = "行政区", y = "气候指标值", fill = "气候时期") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
关键说明
- Terra中合并多个
SpatRaster用c()或merge(),两者效果一致,c()更简洁 extract()处理多栅格时,会自动为每个栅格生成对应列,无需额外处理- 长格式数据是ggplot绘制分组/配对图表的标准格式,确保每个观测对应一行
内容的提问来源于stack exchange,提问作者Sibylle Stöckli
相关产品推荐
相关产品推荐

