데이터를 곡면으로 나타내기
데이터 그리드 플로팅에 사용되는 함수
MATLAB® 그래픽스는 x-y 평면에 있는 사각 그리드 점들의 z 좌표로 곡면을 정의합니다. 이 플롯은 인접한 점들을 직선으로 연결하여 형성됩니다. 곡면 플롯은 너무 커서 숫자 형식으로 표시할 수 없는 행렬을 시각화하고 두 개의 변수로 구성된 함수에 대한 그래프를 작성하는 데 유용합니다.
MATLAB은 다양한 형태의 곡면 플롯을 생성할 수 있습니다. 메시 플롯은 정의된 점들이 연결된 선만 색으로 표시하는 와이어프레임 곡면입니다. 곡면 플롯은 연결선과 곡면의 면을 모두 색으로 표시합니다. 다음 표에는 다양한 형태가 나열되어 있습니다.
함수 | 생성 대상 |
---|---|
mesh , surf | 곡면 플롯 |
meshc , surfc | 아래에 등고선 플롯이 있는 곡면 플롯 |
meshz | 커튼 플롯(기준 평면)이 있는 곡면 플롯 |
pcolor | 평면 플롯(값은 색에만 비례함) |
surfl | 지정된 방향에서 조명을 비추는 곡면 플롯 |
surface | 곡면 그래픽스 객체 생성에 사용되는 로우 레벨 함수(하이 레벨 함수의 기반이 되는 함수) |
데이터 그리딩과 보간에 사용되는 함수
다음 함수는 데이터를 곡면으로 나타낼 수 있도록 하기 위해 데이터를 재구성하고 보간해야 하는 경우 유용합니다.
함수 | 생성 대상 |
---|---|
meshgrid | 2차원 공간과 3차원 공간의 사각 그리드(Rectangular Grid) |
griddata | 산점 데이터 보간 |
griddedInterpolant | 그리딩된 데이터 보간 |
scatteredInterpolant | 산점 데이터 보간 |
데이터 보간 방법에 대한 자세한 내용은 그리딩된 데이터 보간하기 항목과 산점 데이터 보간하기 항목을 참조하십시오.
메시 플롯과 곡면 플롯
mesh
명령과 surf
명령으로 행렬 데이터의 3차원 곡면 플롯을 만들 수 있습니다. Z
가 행렬이고 그 요소인 Z(i,j)
로 기본 (i,j)
그리드 상에 있는 곡면의 높이를 정의하는 경우를 가정해 보겠습니다. 이 경우 다음 명령은
mesh(Z)
곡면에 대해 색이 입혀진 와이어프레임 보기를 생성하고 3차원 보기에 표시합니다. 이와 유사하게 다음 명령은
surf(Z)
곡면에 대해 색이 입혀진 패싯 보기를 생성하고 3차원 보기에 표시합니다. 보통 이 패싯은 사변형인데, 각각의 패싯은 한 가지 색으로 표현되며 검은색 메시 선으로 윤곽이 표시되지만, shading
명령(shading flat
)을 사용하면 메시 선을 제거할 수 있거나 한 패싯 전체에 대해 보간 음영을 선택(shading interp
)할 수 있습니다.
surface 객체 속성을 이용하면 곡면의 시각적 모양을 추가적으로 제어할 수 있습니다. 모서리 선 스타일, 꼭짓점 마커, 면 색상, 조명 특성 등을 지정할 수 있습니다.
두 개의 변수로 구성된 함수 시각화
두 개의 변수로 구성된 함수 z = f(
x,y
)를 표시하려면, 이 함수의 정의역에 대해 각각 반복되는 행과 열로 구성된X
행렬과Y
행렬을 생성하십시오. 이들 행렬을 사용하여 함수를 실행하고 그래프로 표시할 것입니다.meshgrid
함수는 두 벡터x
와y
로 지정된 정의역을X
행렬과Y
행렬로 변환합니다. 그런 다음 이들 행렬을 사용하여 두 개의 변수로 구성된 함수를 실행합니다.X
의 행은 벡터x
의 복사본이며Y
의 열은 벡터y
의 복사본입니다.
meshgrid
의 사용법을 설명하기 위해 sin(r)/r
함수 또는 sinc
함수를 살펴보겠습니다. x와 y 두 변수 모두에 대해 -8과 8 사이 범위에서 이 함수를 실행하려면, 하나의 벡터 인수만 meshgrid
에 전달하십시오. 그럼 이 변수가 두 방향에 다 사용됩니다.
[X,Y] = meshgrid(-8:.5:8); R = sqrt(X.^2 + Y.^2) + eps;
행렬 R
에는 행렬의 중심, 즉 원점으로부터의 거리가 포함됩니다. eps
를 추가하면 데이터에 Inf
값을 생성하는 0으로 나누기 오류 발생을 (다음 단계에서) 방지할 수 있습니다.
sinc
함수를 구성하고 mesh
로 Z
를 플로팅하면 3차원 곡면이 생성됩니다.
Z = sin(R)./R; figure mesh(X,Y,Z)
숨겨진 선 제거
기본적으로 MATLAB은 플롯의 면이 채워져 있지 않더라도 메시 플롯에서 보이지 않는 부분의 숨겨져 있는 선을 제거합니다. hidden
명령을 사용하여 숨겨진 선 제거를 비활성화하고 메시 플롯의 면이 투명하게 만들 수 있습니다.
hidden off
곡면 형태 강조하기
MATLAB은 그래프의 정보 콘텐츠를 향상할 수 있는 여러 가지 기법을 제공합니다. 예를 들어, sinc
함수에 대한 다음 그래프는 위에 표시된 그래프와 동일한 데이터를 사용하지만 조명, 보기 조정, 다른 컬러맵을 이용해 그래프로 표시된 함수의 형태를 강조합니다(daspect
, axis
, view
, camlight
).
figure colormap hsv surf(X,Y,Z,'FaceColor','interp',... 'EdgeColor','none',... 'FaceLighting','gouraud') daspect([5 5 1]) axis tight view(-50,30) camlight left
곡면 플롯에 대한 자세한 내용은 surf
함수를 참조하십시오.
균일하지 않게 샘플링된 데이터의 곡면 플롯
meshgrid
를 사용하여 균일하게 샘플링된 데이터 점으로 구성된 그리드를 만들고 이 데이터 점에서 sinc
함수를 실행하고 그래프로 표시할 수 있습니다. MATLAB은 인접한 행렬 요소를 연결하여 곡면 플롯을 생성해 사변형으로 구성된 메시를 형성합니다.
균일하지 않게 샘플링된 데이터에서 곡면 플롯을 생성하려면 scatteredInterpolant
를 사용하여 균일한 간격의 점에서 값을 보간한 다음, 일반적인 방식으로 mesh
와 surf
를 사용하십시오.
예제 – 곡면에 균일하지 않은 데이터 표시하기
이 예제에서는 특정 범위 내에 있는 임의의 점에서 sinc
함수를 실행한 후 곡면 플롯으로 표시할 균일하게 샘플링된 데이터를 생성합니다. 이 과정은 다음 작업을 포함합니다.
linspace
를 사용하여 균일하지 않게 샘플링된 데이터의 범위에 균일한 간격의 값을 생성합니다.meshgrid
에linspace
의 출력값을 사용하여 플로팅 그리드를 생성합니다.scatteredInterpolant
를 사용하여 불규칙적으로 샘플링된 데이터를meshgrid
에 의해 반환되는 규칙적인 간격의 그리드로 보간합니다.플로팅 함수를 사용하여 데이터를 표시합니다.
범위 [-8, 8] 내에서 균일하지 않게 샘플링된 데이터를 생성하고 이를 사용하여 함수를 실행합니다.
x = rand(100,1)*16 - 8; y = rand(100,1)*16 - 8; r = sqrt(x.^2 + y.^2) + eps; z = sin(r)./r;
linspace
함수를 사용하면 원하는 요소 개수를 갖는 균일한 간격의 데이터를 편리하게 생성할 수 있습니다. 다음 명령문은 앞에서 설명한sinc
예제의 -8:.5:8 명령문으로 생성된 것과 같은 간격으로 난수 데이터 범위에서 벡터를 생성합니다.xlin = linspace(min(x),max(x),33); ylin = linspace(min(y),max(y),33);
이제 이 점을 사용하여 간격이 균일한 그리드를 생성합니다.
[X,Y] = meshgrid(xlin,ylin);
이 과정의 핵심은
scatteredInterpolant
를 사용하여 원래 데이터 점(이 예제에서는 임의의 데이터 점)에서의 함수 값을 기반으로 균일한 간격의 점에서의 함수 값을 보간하는 것입니다. 다음 명령문에서는 디폴트 선형 보간을 사용하여 새 데이터를 생성합니다.f = scatteredInterpolant(x,y,z); Z = f(X,Y);
보간된 데이터와 균일하지 않은 데이터를 플로팅하여 다음을 생성합니다.
figure mesh(X,Y,Z) %interpolated axis tight; hold on plot3(x,y,z,'.','MarkerSize',15) %nonuniform
데이터의 형태 변경하기
다음 (X, Y, Z)의 세 좌표값을 가진 데이터 모음이 있다고 가정해 보겠습니다.
X | Y | Z |
---|---|---|
1 | 1 | 152 |
2 | 1 | 89 |
3 | 1 | 100 |
4 | 1 | 100 |
5 | 1 | 100 |
1 | 2 | 103 |
2 | 2 | 0 |
3 | 2 | 100 |
4 | 2 | 100 |
5 | 2 | 100 |
1 | 3 | 89 |
2 | 3 | 13 |
3 | 3 | 100 |
4 | 3 | 100 |
5 | 3 | 100 |
1 | 4 | 115 |
2 | 4 | 100 |
3 | 4 | 187 |
4 | 4 | 200 |
5 | 4 | 111 |
1 | 5 | 100 |
2 | 5 | 85 |
3 | 5 | 111 |
4 | 5 | 97 |
5 | 5 | 48 |
먼저 데이터를 재구성함으로써 surf
, contour
, stem3
등의 다양한 MATLAB 그래프 유형을 사용하여 벡터 형식의 데이터를 나타낼 수 있습니다. (X, Y) 값을 사용하여, Z값에 대응하는 x-y 평면의 좌표값을 정의합니다. reshape
함수와 transpose
함수는 (X, Y, Z)의 세 좌표값이 사각 그리드를 형성하도록 데이터를 재구성할 수 있습니다.
x = reshape(X,5,5)'; y = reshape(Y,5,5)'; z = reshape(Z,5,5)';
형태를 변경하면 다음과 같이 3개의 5x5 배열이 생성됩니다.
x = 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 y = 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 z = 152 89 100 100 100 103 0 100 100 100 89 13 100 100 100 115 100 187 200 111 100 85 111 97 48
이제 X와 Y에 대한 Z의 값을 나타낼 수 있습니다. 예를 들어, 다음과 같이 3차원 줄기 그래프를 만들 수 있습니다.
stem3(x,y,z,'MarkerFaceColor','g')
파라미터 곡면
곡면을 그리는 함수는 특정 x, y 데이터를 가지는 곡면을 나타낼 목적으로 벡터 또는 행렬 인수를 2개 더 받을 수 있습니다. Z
는 m×n 행렬이고, x
는 n개 요소를 갖는 벡터이고, y
는 m개 요소를 갖는 벡터인 경우, 다음은
mesh(x,y,Z,C)
다음 점에 위치하며 색이 C(i,j)
인 꼭짓점을 갖는 메시 곡면을 나타냅니다.
(x(j), y(i), Z(i,j))
여기서 x
와 y
는 각각 Z
의 열과 행에 대응합니다.
더 일반적으로, X
, Y
, Z
, C
가 크기가 같은 행렬인 경우, 다음은
mesh(X,Y,Z,C)
다음 점에 위치하며 색이 C(i,j)
인 꼭짓점을 갖는 메시 곡면을 나타냅니다.
(X(i,j), Y(i,j), Z(i,j))
이 예제에서는 구면 좌표를 사용하여 구를 그린 후, 신호 처리 부호 이론에 사용되는 직교 행렬인 아다마르 행렬 내 플러스 기호와 마이너스 기호의 패턴을 따라 구에 색을 입힙니다. 벡터 theta
와 phi
의 범위는 각각 -
π ≤ theta
≤ π과 -
π/2
≤ phi
≤ π/2
입니다. theta
는 행 벡터이고 phi
는 열 벡터이므로, 행렬 X
, Y
, Z
를 생성하는 곱셈은 벡터 외적입니다.
figure k = 5; n = 2^k-1; theta = pi*(-n:2:n)/n; phi = (pi/2)*(-n:2:n)'/n; X = cos(phi)*cos(theta); Y = cos(phi)*sin(theta); Z = sin(phi)*ones(size(theta)); colormap([0 0 0;1 1 1]) C = hadamard(2^k); surf(X,Y,Z,C) axis square