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)를 이어 붙인 것입니다. 아래의 실행 가능한 예제는 완전한 3x3 표본 관측 집합을 사용하므로, 선택적 플로팅 패키지 중 하나를 사용할 수 없을 때도 기본 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 항목의 정렬을 유지하세요.