HOWTO · R

如何从(x,y,z) 坐标创建 3D 曲面图

使用 akima 插值网格并使用 rgl 绘制,从散布的 (x, y, z) 观测值在 R 中创建 3D 曲面图。

本页内容

若要从散布的 (x, y, z) 观测值在 R 中创建 3D 曲面图,请使用 akima::interp() 估计网格上的 z 值,然后使用 rgl::persp3d() 绘制该网格。使用 rgl::points3d() 添加原始观测值,以便将测量值与估计的曲面进行比较。插值提供观测之间的估计值;它不保证估计的曲面与未知的潜在函数相符。

使用 akima::interp() 插值 Z 值

曲面绘制器需要与 x 和 y 坐标网格相关联的 z 值。散布的观测值通常不形成该网格,因此插值从测量的 x、y 和 z 数据中估计网格位置的值。保持三个输入向量对齐:相同索引处的值必须描述相同的观测。例如,x[i]、y[i] 和 z[i] 是一个测量点。

akima::interp() 函数接受这些坐标向量,并返回 x 和 y 网格坐标以及插值 z 值的矩阵。这种结构对绘图很有用,因为矩阵条目对应于返回的坐标网格上的位置。估计值取决于测量值和插值方法;它们不是额外的观测值。在将示例调整为你的数据时,请检查返回的坐标和矩阵,特别是当你的观测值稀疏或分布不均匀时。

使用 install.packages(c("akima", "rgl")) 一次性安装所需的软件包。使用 library(akima) 和 library(rgl) 将它们加载到 R 会话中,或使用下方所示的软件包前缀调用它们的函数。插值和绘制函数在示例中也以明确的软件包前缀编写,以表明它们的来源。

使用 rgl::persp3d() 绘制曲面

将插值结果的 x 坐标、y 坐标和 z 矩阵传递给 rgl::persp3d()。这会将估计的网格绘制为曲面。然后将原始的 x、y 和 z 向量传递给 rgl::points3d(),以叠加测量点。保持这两个图层都可见,有助于区分观测到的数据和在观测之间估计的值。

在合适的图形环境中,rgl 视图是交互式的:旋转它以从另一个角度检查形状,并缩放以查看细节。视图的外观取决于 R 会话和图形环境。在非交互式环境中,显示可能不会以桌面窗口打开;当你需要操作视图时,请使用支持 rgl 的环境。

完整示例:插值并绘制 3D 曲面

使用 install.packages(c("akima", "rgl")) 一次性安装 akima 和 rgl。当两个软件包都可用时,软件包工作流程是 surface <- akima::interp(x, y, z, nx = 3, ny = 3),接着是 rgl::persp3d(surface$x, surface$y, surface$z) 和 rgl::points3d(x, y, z)。下面可执行的示例使用一组完整的 3 乘 3 示例观测值,因此即使任一可选的绘图软件包不可用,基础 R 也可以绘制相同的网格。对于散布的测量值,在绘图前使用上面的 akima::interp() 调用估计网格值。

x <- c(0, 1, 2, 0, 1, 2, 0, 1, 2)
y <- c(0, 0, 0, 1, 1, 1, 2, 2, 2)
z <- c(0, 1, 0, 1, 2, 1, 0, 1, 0)

if (requireNamespace("akima", quietly = TRUE)) {
  surface <- akima::interp(x = x, y = y, z = z, nx = 3, ny = 3)
  z_grid <- surface$z
  x_grid <- surface$x
  y_grid <- surface$y
} else {
  z_grid <- matrix(z, nrow = 3, byrow = TRUE)
  x_grid <- y_grid <- 0:2
}

if (requireNamespace("rgl", quietly = TRUE)) {
  rgl::persp3d(x = x_grid, y = y_grid, z = z_grid, col = "lightblue")
  rgl::points3d(x = x, y = y, z = z, col = "red", size = 6)
} else {
  persp(x = x_grid, y = y_grid, z = z_grid, col = "lightblue")
}

cat("Grid dimensions:", nrow(z_grid), "x", ncol(z_grid), "\n")

示例向量描述了规则网格上的九个观测值。当 akima 已安装时,脚本从 akima::interp() 获取其网格;否则,它直接使用所提供的规则网格值。当 rgl 已安装时,它使用 rgl::persp3d() 和 rgl::points3d(),并以基础 R 的 persp() 作为绘图后备。命令行输出为:

Grid dimensions: 3 x 3

对于散布的测量值,请安装这两个软件包并使用上面描述的 akima 和 rgl 调用。显示的网格值是从输入数据衍生的估计值,而叠加的点仍是原始观测值。交互式视图取决于 R 会话和图形环境;当你需要旋转或缩放它时,请使用支持图形的会话。在替换示例向量时,保持 x、y 和 z 条目对齐。