如何用Rastervis::levelplot合并同图例RasterStack并保持图幅一致
当然可以用rasterVis::levelplot实现这个需求!你的思路(用grid.arrange组合后统一添加图例)完全可行,我给你两种实用方案参考,适配不同的使用习惯:
方案1:用levelplot原生布局实现(更简洁)
这种方式不需要额外依赖gridExtra,直接通过levelplot的内置参数控制两个堆叠的排版、间距和共用图例,还能保证所有栅格的尺寸完全一致。
代码示例
library(raster) library(rasterVis) library(viridis) # 用这个包的配色更美观,可选 # 模拟两个结构一致的RasterStack(实际使用时确保你的两个Stack范围/分辨率相同) set.seed(123) s1 <- stack(raster(matrix(runif(9), 3, 3)), raster(matrix(runif(9), 3, 3))) s2 <- stack(raster(matrix(runif(9), 3, 3)), raster(matrix(runif(9), 3, 3))) # 合并成一个大Stack,方便统一图例和布局 combined_stack <- stack(s1, s2) names(combined_stack) <- c("Stack1\nLayer1", "Stack2\nLayer1", "Stack1\nLayer2", "Stack2\nLayer2") # 绘制图形 levelplot(combined_stack, layout = c(2, 2), # 2列2行的布局:左列是s1的两层,右列是s2的两层 between = list(x = c(0.8, 0), y = 0), # 列之间留0.8单位的空白(可自定义) col.regions = viridis(100), # 统一配色方案 colorkey = list(space = "bottom"), # 共用图例放在底部 scales = list(draw = FALSE), # 去掉重复的轴刻度,让图更整洁 par.settings = list(axis.line = list(col = NA))) # 隐藏边框线,可选
关键要点
- 确保两个原始
RasterStack的空间范围、分辨率完全一致,这样绘制出的栅格尺寸才会相同; between参数用来控制面板之间的空白,x对应列间距,y对应行间距;- 如果两个Stack的数值范围不同,手动指定
at参数统一图例刻度,比如at = seq(min(combined_stack[]), max(combined_stack[]), length.out = 101)。
方案2:用grid.arrange配合提取图例(更灵活)
如果你更习惯用gridExtra的grid.arrange来组合图形,可以先分别绘制不带图例的两个堆叠图,提取其中一个的图例,再将三者组合,同时调整间距保证栅格尺寸一致。
代码示例
library(raster) library(rasterVis) library(gridExtra) library(grid) library(viridis) # 模拟数据 set.seed(123) s1 <- stack(raster(matrix(runif(9), 3, 3)), raster(matrix(runif(9), 3, 3))) s2 <- stack(raster(matrix(runif(9), 3, 3)), raster(matrix(runif(9), 3, 3))) # 绘制两个不带图例的levelplot p1 <- levelplot(s1, colorkey = FALSE, scales = list(draw = FALSE), names.attr = c("Stack1 Layer1", "Stack1 Layer2")) p2 <- levelplot(s2, colorkey = FALSE, scales = list(draw = FALSE), names.attr = c("Stack2 Layer1", "Stack2 Layer2")) # 提取共用图例(从任意一个图中提取即可,配色要统一) legend <- draw.colorkey(key = list(col = viridis(100), at = seq(0, 1, length.out = 101))) # 先给两个图之间添加空白,再组合图例 # 创建空白grob作为间隔 blank_grob <- rectGrob(gp = gpar(col = NA, fill = NA)) # 组合p1、空白、p2 combined_plots <- gtable::gtable_add_cols(gtable::gtable_merge(p1, p2, "row"), widths = unit(1, "inch"), pos = 1) # 最终组合所有元素 grid.arrange(combined_plots, legend, ncol = 1, heights = c(4, 1)) # 控制图和图例的高度比例
关键要点
- 用
draw.colorkey提取图例时,务必保证两个图的配色和刻度范围一致; - 用
gtable::gtable_add_cols添加空白grob,能精准控制两个堆叠之间的空白宽度; - 同样要确保原始
RasterStack的空间属性一致,否则栅格尺寸会出现差异。
总结一下,两种方法都能完美实现你的需求:方案1更贴合rasterVis的原生逻辑,代码更简洁;方案2灵活性更高,适合需要复杂排版的场景。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

