R에서 3D 투시도 만들기
Jesse John
2023년1월30일
기본 R의 persp()
함수를 사용하여 표면의 투시도를 만들 수 있습니다. 표면은 (x,y)
값의 모든 쌍에 해당하는 z
값을 통과합니다.
persp()
함수를 사용하려면 주요 인수의 형식을 이해해야 합니다. 이 기사의 나머지 부분에서는 간단한 예를 통해 이를 설명하고 설명합니다.
R의 persp()
함수 인수
persp()
가 3차원으로 플롯되므로 3개의 좌표에 대해 x
, y
및 z
인수가 세 개 있습니다.
-
x
와y
는 숫자 벡터입니다. 오름차순이어야 합니다. -
z
인수는 행렬을 취합니다. 이 행렬에는x
와y
의 각 조합에 해당하는z
값이 하나만 있어야 합니다.플롯된 표면은 모든
z
값을 통과합니다.
z
에 대한 행렬을 만드는 한 가지 방법은 outer()
함수를 사용하여 x
와 y
값의 모든 조합에 이변량 함수를 적용하는 것입니다.
기본적으로 persp()
함수는 y
축의 음수 측면에서 보기를 표시합니다.
phi
인수는 colatitude를 제공합니다.phi
를 0도에서 90도로 변경하면 전면에서 상단으로의 뷰 변경에 영향을 줍니다.theta
인수는 방위각을 제공합니다.theta
를 0도에서 90도로 변경하면 그림을 수직 축을 중심으로 시계 방향으로 회전시키는 효과가 있습니다.
R의 평면도
이제 두 개의 평면을 만들고 다른 각도에서 볼 것입니다. 첫 번째는 수평면입니다.
예제 코드:
# A function that gives a constant z value.
H = function(x, y){
return (0*x+0*y+1)
}
X = seq(-1,1,length.out=5)
Y = seq(-1,1, length.out=5)
# Apply the H function to all pairs (x,y).
# This gives the z matrix.
Z = outer(X, Y, H)
# Four different views.
persp(x=X,y=Y,z=Z, theta=0, phi=0, xlim=range(-2,2), ylim=range(-2,2), zlim=range(-2,2))
persp(x=X,y=Y,z=Z, theta=0, phi=45, xlim=range(-2,2), ylim=range(-2,2), zlim=range(-2,2))
persp(x=X,y=Y,z=Z, theta=0, phi=90, xlim=range(-2,2), ylim=range(-2,2), zlim=range(-2,2))
persp(x=X,y=Y,z=Z, theta=45, phi=45, xlim=range(-2,2), ylim=range(-2,2), zlim=range(-2,2))
출력 수치:
4개의 그림은 theta
와 phi
각도를 변경할 때의 효과를 보여줍니다.
다음으로 경사면을 살펴보겠습니다. 구문은 또한 다른 persp()
함수 인수를 설정하는 방법을 보여줍니다.
예제 코드:
# A function for a plane.
O = function(x, y){
return (2*x+3*y-2)
}
X1 = seq(-2,2,length.out=15)
Y1 = seq(-2,2, length.out=15)
# Apply the function to all combinations of x and y.
Z1 = outer(X1, Y1, O)
# Check the range of the values of Z.
# This will help create the limits for the box.
range(Z1)
# Because we do not use the scale=FALSE argument, the output is a cube.
# The axes are scaled.
persp(x=X1,y=Y1,z=Z1, theta=20, phi=10, xlim=range(-5,5), ylim=range(-5,5), zlim=range(-12,8),
xlab="x-axis",
ylab="y-axis",
zlab="z-axis",
main="Oblique Plane",
col="#00FFFF",
ticktype="detailed",
nticks=3)
# With scale=FALSE.
persp(x=X1,y=Y1,z=Z1, theta=-15, phi=5, xlim=range(-5,5), ylim=range(-5,5), zlim=range(-12,8),
scale = FALSE,
xlab="x-axis",
ylab="y-axis",
zlab="z-axis",
main="Oblique Plane",
col="#FF00FF",
ticktype="detailed",
nticks=3)
출력 수치:
R의 행렬에서 플롯
persp()
함수는 x
및 y
벡터에 해당하는 z
값의 행렬에서 오름차순으로 플롯할 수 있습니다.
z
의 행 및 열 수는 각각 x
및 y
의 길이와 일치해야 합니다.
예제 코드:
# Manually create a matrix of z values corresponding
# to all combinations of some x and y.
# (Or use such a pre-existing matrix.)
Z2 = matrix(data=c(1,1,1,1,1,
1,-1,-1,-1,1,
1,-1,3,-1,1,
1,-1,-1,-1,1,
1,1,1,1,1), ncol=5)
X2 = seq(-4, 4, length.out=5)
Y2 = seq(-2, 2, by=1)
persp(x=X2, y=Y2, z=Z2, scale=FALSE, col="#CBD68A", theta=30, phi=15)
출력 수치:
작가: Jesse John