如何在R语言中实现时间堆叠地图的可视化?
3D堆叠可视化时序栅格数据
我用以下代码生成了包含3个时间步的时序栅格数据:
library(terra) # 从文件创建SpatRaster f <- system.file("ex/elev.tif", package="terra") r <- rast(f) # 生成3个时间步的时序数据 r = c(r, r*1.5, r*2)
我想要实现时间堆叠可视化,也就是把不同时间的2D地图(切片)沿时间轴堆叠成3D形式。
预期效果
将多个时序栅格切片沿Z轴(代表时间维度)堆叠,形成立体的3D展示效果,每个切片保留自身的空间分布和颜色映射,能直观看到时间维度上的变化。
已尝试的方法
我用ggplot2做了分面可视化,代码如下:
library(ggplot2) library(tidyr) df = as.data.frame(r, xy = TRUE) |> tibble::tibble(.name_repair = "unique") |> pivot_longer(-c(1, 2)) ggplot(df, aes(x, y, fill = value)) + geom_raster() + facet_grid(~name)
但这个方法是把各时间步的地图并列分面展示,不是我想要的堆叠式3D效果。
解决方案:用rgl实现交互式3D堆叠可视化
可以使用rgl包创建交互式的3D堆叠效果,每个时间步对应Z轴上的一个层级,具体代码如下:
library(rgl) library(terra) # 生成数据(同问题代码) f <- system.file("ex/elev.tif", package="terra") r <- rast(f) r <- c(r, r*1.5, r*2) # 将栅格转换为矩阵列表 r_list <- lapply(1:nlyr(r), function(i) as.matrix(r[[i]])) x <- xFromCol(r) y <- yFromRow(r) z_levels <- 1:nlyr(r) # 每个时间步对应一个Z高度 # 初始化3D窗口 open3d() # 逐个绘制每个时间步的表面 for(i in seq_along(r_list)){ surface3d(x, y, rep(z_levels[i], length(x)*length(y)), z = r_list[[i]], col = terrain.colors(100)[cut(r_list[[i]], 100)], alpha = 0.8) # 设置透明度,方便看到下层切片 } # 添加坐标轴标签 axes3d() title3d(xlab = "X", ylab = "Y", zlab = "时间步")
这段代码会生成一个交互式3D窗口,你可以旋转、缩放视角查看堆叠的时序栅格,通过调整alpha参数控制切片透明度,能同时观察多层数据的空间分布。
备选方案:用plot3D生成静态3D堆叠图
如果需要静态可视化结果,可以使用plot3D包,通过散点颜色映射栅格值,沿Z轴堆叠时间步:
library(plot3D) library(terra) library(tidyr) # 数据准备 f <- system.file("ex/elev.tif", package="terra") r <- rast(f) r <- c(r, r*1.5, r*2) # 转换为长格式数据 df <- as.data.frame(r, xy = TRUE) |> tibble::tibble(.name_repair = "unique") |> pivot_longer(-c(x, y), names_to = "time", values_to = "value") |> mutate(time = as.integer(factor(time))) # 绘制3D堆叠图 scatter3D(df$x, df$y, df$time, colvar = df$value, col = terrain.colors(100), pch = 16, cex = 0.5, xlab = "X", ylab = "Y", zlab = "时间步", ticktype = "detailed")
内容的提问来源于stack exchange,提问作者bird
相关产品推荐
相关产品推荐

