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 條目對齊。