Main Content

데이터를 곡면으로 나타내기

데이터 그리드 플로팅에 사용되는 함수

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 객체 속성을 이용하면 곡면의 시각적 모양을 추가적으로 제어할 수 있습니다. 모서리 선 스타일, 꼭짓점 마커, 면 색상, 조명 특성 등을 지정할 수 있습니다.

두 개의 변수로 구성된 함수 시각화

  1. 두 개의 변수로 구성된 함수 z = f(x,y)를 표시하려면, 이 함수의 정의역에 대해 각각 반복되는 행과 열로 구성된 X 행렬과 Y 행렬을 생성하십시오. 이들 행렬을 사용하여 함수를 실행하고 그래프로 표시할 것입니다.

  2. meshgrid 함수는 두 벡터 xy로 지정된 정의역을 X 행렬과 Y 행렬로 변환합니다. 그런 다음 이들 행렬을 사용하여 두 개의 변수로 구성된 함수를 실행합니다. X의 행은 벡터 x의 복사본이며 Y의 열은 벡터 y의 복사본입니다.

예 1. 예제: meshgrid의 사용법 설명

meshgrid의 사용법을 설명하기 위해 sin(r)/r 함수 또는 sinc 함수를 살펴보겠습니다. xy 두 변수 모두에 대해 -8과 8 사이 범위에서 이 함수를 실행하려면, 하나의 벡터 인수만 meshgrid에 전달하십시오. 그럼 이 변수가 두 방향에 다 사용됩니다.

[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;

행렬 R에는 행렬의 중심, 즉 원점으로부터의 거리가 포함됩니다. eps를 추가하면 데이터에 Inf 값을 생성하는 0으로 나누기 오류 발생을 (다음 단계에서) 방지할 수 있습니다.

sinc 함수를 구성하고 meshZ를 플로팅하면 3차원 곡면이 생성됩니다.

Z = sin(R)./R;
figure
mesh(X,Y,Z)

Mesh plot of a sinc function

숨겨진 선 제거

기본적으로 MATLAB은 플롯의 면이 채워져 있지 않더라도 메시 플롯에서 보이지 않는 부분의 숨겨져 있는 선을 제거합니다. hidden 명령을 사용하여 숨겨진 선 제거를 비활성화하고 메시 플롯의 면이 투명하게 만들 수 있습니다.

hidden off

Mesh plot of a sinc function. The mesh lines at the back of the surface show through the surface.

곡면 형태 강조하기

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

Surface plot of a sinc function with the colors of the hsv colormap and gouraud lighting

곡면 플롯에 대한 자세한 내용은 surf 함수를 참조하십시오.

균일하지 않게 샘플링된 데이터의 곡면 플롯

meshgrid를 사용하여 균일하게 샘플링된 데이터 점으로 구성된 그리드를 만들고 이 데이터 점에서 sinc 함수를 실행하고 그래프로 표시할 수 있습니다. MATLAB은 인접한 행렬 요소를 연결하여 곡면 플롯을 생성해 사변형으로 구성된 메시를 형성합니다.

균일하지 않게 샘플링된 데이터에서 곡면 플롯을 생성하려면 scatteredInterpolant를 사용하여 균일한 간격의 점에서 값을 보간한 다음, 일반적인 방식으로 meshsurf를 사용하십시오.

예제 – 곡면에 균일하지 않은 데이터 표시하기

이 예제에서는 특정 범위 내에 있는 임의의 점에서 sinc 함수를 실행한 후 곡면 플롯으로 표시할 균일하게 샘플링된 데이터를 생성합니다. 이 과정은 다음 작업을 포함합니다.

  • linspace를 사용하여 균일하지 않게 샘플링된 데이터의 범위에 균일한 간격의 값을 생성합니다.

  • meshgridlinspace의 출력값을 사용하여 플로팅 그리드를 생성합니다.

  • scatteredInterpolant를 사용하여 불규칙적으로 샘플링된 데이터를 meshgrid에 의해 반환되는 규칙적인 간격의 그리드로 보간합니다.

  • 플로팅 함수를 사용하여 데이터를 표시합니다.

  1. 범위 [-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;
    
  2. linspace 함수를 사용하면 원하는 요소 개수를 갖는 균일한 간격의 데이터를 편리하게 생성할 수 있습니다. 다음 명령문은 앞에서 설명한 sinc 예제의 -8:.5:8 명령문으로 생성된 것과 같은 간격으로 난수 데이터 범위에서 벡터를 생성합니다.

    xlin = linspace(min(x),max(x),33);
    ylin = linspace(min(y),max(y),33);
    
  3. 이제 이 점을 사용하여 간격이 균일한 그리드를 생성합니다.

    [X,Y] = meshgrid(xlin,ylin);
    
  4. 이 과정의 핵심은 scatteredInterpolant를 사용하여 원래 데이터 점(이 예제에서는 임의의 데이터 점)에서의 함수 값을 기반으로 균일한 간격의 점에서의 함수 값을 보간하는 것입니다. 다음 명령문에서는 디폴트 선형 보간을 사용하여 새 데이터를 생성합니다.

    f = scatteredInterpolant(x,y,z);
    Z = f(X,Y);
  5. 보간된 데이터와 균일하지 않은 데이터를 플로팅하여 다음을 생성합니다.

    figure
    mesh(X,Y,Z) %interpolated
    axis tight; hold on
    plot3(x,y,z,'.','MarkerSize',15) %nonuniform
    

    Mesh plot of a surface with interpolated points at random locations

데이터의 형태 변경하기

다음 (X, Y, Z)의 세 좌표값을 가진 데이터 모음이 있다고 가정해 보겠습니다.

XYZ
11152
2189
31100
41100
51100
12103
220
32100
42100
52100
1389
2313
33100
43100
53100
14115
24100
34187
44200
54111
15100
2585
35111
4597
5548

먼저 데이터를 재구성함으로써 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')

3-D stem plot

파라미터 곡면

곡면을 그리는 함수는 특정 x, y 데이터를 가지는 곡면을 나타낼 목적으로 벡터 또는 행렬 인수를 2개 더 받을 수 있습니다. Zm×n 행렬이고, xn개 요소를 갖는 벡터이고, ym개 요소를 갖는 벡터인 경우, 다음은

mesh(x,y,Z,C)

다음 점에 위치하며 색이 C(i,j)인 꼭짓점을 갖는 메시 곡면을 나타냅니다.

(x(j), y(i), Z(i,j))

여기서 xy는 각각 Z의 열과 행에 대응합니다.

더 일반적으로, X, Y, Z, C가 크기가 같은 행렬인 경우, 다음은

mesh(X,Y,Z,C)

다음 점에 위치하며 색이 C(i,j)인 꼭짓점을 갖는 메시 곡면을 나타냅니다.

(X(i,j), Y(i,j), Z(i,j))

이 예제에서는 구면 좌표를 사용하여 구를 그린 후, 신호 처리 부호 이론에 사용되는 직교 행렬인 아다마르 행렬 내 플러스 기호와 마이너스 기호의 패턴을 따라 구에 색을 입힙니다. 벡터 thetaphi의 범위는 각각 -π ≤ theta ≤ π과 -π/2phi ≤ π/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

Surface plot of a sphere covered in a black-and-white pattern