HOWTO · R
(x,y,z) 座標から 3D サーフェスプロットを作成する方法
散らばった (x, y, z) 観測値から、akima でグリッドを補間し rgl で描画して、R で 3D サーフェスプロットを作成します。
このページの内容
散らばった (x, y, z) 観測値から R で 3D サーフェスプロットを作成するには、akima::interp() でグリッド上の z 値を推定し、そのグリッドを rgl::persp3d() で描画します。元の観測値を rgl::points3d() で追加すると、測定値を推定されたサーフェスと比較できます。補間は観測間の推定値を提供しますが、推定されたサーフェスが未知の基になる関数と一致することは保証しません。
akima::interp() で Z 値を補間する
サーフェス レンダラーには、x 座標と y 座標のグリッドに関連付けられた z 値が必要です。散らばった観測値は通常そのグリッドを形成しないため、補間により、測定された x、y、z データからグリッド位置の値を推定します。3 つの入力ベクトルは揃えてください。同じインデックスの値は同じ観測を表していなければなりません。たとえば、x[i]、y[i]、z[i] は 1 つの測定点です。
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")
サンプル ベクトルは、規則的なグリッド上にある 9 つの観測を表します。akima がインストールされている場合、スクリプトはグリッドを akima::interp() から取得します。そうでない場合は、提供された規則的なグリッド値を直接使用します。rgl がインストールされている場合は rgl::persp3d() と rgl::points3d() を使い、描画の代替として基本 R の persp() を使います。コマンドライン出力は次のとおりです。
Grid dimensions: 3 x 3
散らばった測定値については、両方のパッケージをインストールし、上記の akima と rgl の呼び出しを使ってください。表示されるグリッド値は入力データから導出された推定値であり、重ねられた点は元の観測のままです。対話式ビューは R セッションとグラフィックス環境に依存します。回転やズームが必要な場合は、グラフィックス対応のセッションを使ってください。サンプル ベクトルを置き換える際は、x、y、z のエントリを揃えたままにしてください。