자급자족하는 블로그

[MATLAB] 데이터의 2D plot (Two-Dimensional Plots) -1 본문

MATLAB

[MATLAB] 데이터의 2D plot (Two-Dimensional Plots) -1

YPSR 2018. 7. 25. 23:28

데이터 또는 정보를 설명하는 데에 있어서 그를 2차원 평면에서 그림으로 나타내는 것은 굉장히 유용한 방법입니다.

본 포스팅에서는 MATLAB을 이용한 2D plotting에 대해서 알아보겠습니다.


본격적인 설명에 앞서, 예시 그림과 함께 오늘 사용할 용어를 짚고 넘어가겠습니다.


Fig 1. Components of a 2D plot in MATLAB



1. 2D plot과 관련된 기본적인 함수: plot


plot이라는 함수가 2차원 그래프를 그리는 데에 자주 사용되는 함수입니다.

사용법은 아래와 같습니다.


>> figure; plot(x, y);


여기서 plot 함수의 입력인 x와 y는 vector, 즉 1차원 array여야 하며, 두 vector의 size는 동일해야 합니다.

왜냐하면 위 명령은 y를 x에 대해서 plot하라는 명령이기 때문입니다.

따라서 x에 대한 y의 값은 하나로 결정되어야 하며, 이것이 두 vector의 size가 동일해야 하는 이유입니다.

만약 입력이 x 하나만 있다면 index array에 대해서 x가 plot됩니다.


figure 명령어는 Figure window를 띄우라는 명령입니다.

이것을 추가한 이유는 모든 그래프 또는 그림은 Figure window에 그려지기 때문입니다.

물론 figure 명령어를 사용하지 않아도 plot 함수를 호출하면 Figure window가 띄워지지만, 여러 그래프를 서로 다른 Figure window에 그리기 위해서는 Figure window를 각각 띄워줘야 합니다.


예제로 넘어가기 전에, plot 함수의 입력으로 들어갈 수 있는 인자에 대해 더 알아보도록 합시다.


>> plot(x, y, 'line specifiers', 'PropertyName', PropertyValue);


위의 'line specifiers'는 그래프의 선 모양(line style)과 색(line color), maker의 모양(marker type)을 결정하는 입력입니다.

각각 아래의 선택지 중 하나씩 골라서 입력하면 그에 맞는 line으로 그래프가 그려집니다.


 -

 실선 (default)

 --

 파선

 :

 점선

 -.

 쇄선

Table 1. Characters for line styles


 r

 붉은색

 g

 초록색

 b

 파란색 

 c

 청록색

 m

 자홍색

 y 노란색
 k 검은색
 w

 흰색

Table 2. Characters for line colors


 +

 + 모양

 

 s

 정사각형

 o

 작은 원

 

 d

 마름모

 *

 * 모양

 

 p

 별 모양(오망성)

 .

 점

 

 h

 별 모양(육망성)

 x

 x 표시

 

 <

 정삼각형(왼쪽을 가리킴)

 ^

 정삼각형(위쪽를 가리킴)

 

 >

 정삼각형(오른쪽을 가리킴)

 v

 정삼각형(아래쪽을 가리킴)

 

 

 

Table 3. Characters for marker types


위 문자들이 specifier를 구성하는 것입니다.

굳이 3개의 문자를 가지고 구성할 필요는 없으며, 2개 이하를 가지고 설정을 하면 입력하지 않은 부분은 default setting으로 그래프가 그려집니다.

또한 세 가지의 specifier component들의 순서는 그래프에 아무런 영향을 주지 않습니다. '--k^'나 '^k--'나 동일한 line specifier라는 것이죠.


'PropertyName'과 PropertyValue는 그 외 그래프 plot에 대한 설정을 위한 것입니다.

선의 두께(linewidth), marker의 크기(markersize) 등을 설정할 수 있으며, 아래는 설정 가능한 property들입니다.


 LineWidth

 (linewidth)

 선의 두께

 point 단위의 수 (default로 0.5 pt)

 MarkerSize

 (makersize)

 marker의 크기

 point 단위의 수

 MarkerEdgeColor

 (markeredgecolor)

 marker의 윤곽선의 색

 Table 2와 동일

 MarkerFaceColor

 (markerfacecolor)

 marker의 채우기 색

 Table 2와 동일

Table 4. Types of properties and their possible values


이 표들을 참고하여, 아래의 명령문을 분석해봅시다.


>> figure; plot(x, y, '-mo', 'LineWidth', 2, 'MarkerSize', 12, 'MarkerEdgeColor', 'g', 'MarkerFaceColor', 'y');


x에 대해 y를 plot 하라는 명령이며, 이 때 자홍색의 두께 2 pt의 실선과 12pt 크기의 초록색 윤곽선을 가지며 노란색으로 채워진 원을 marker로 설정해준 것입니다. 직접 확인해봅시다.


Fig 2. The result of the above command


예상과 같이 출력되었음을 확인할 수 있습니다.


plot 함수 외에 fplot이라는 함수도 있는데요, fplot은 어떠한 함수의 2D plot을 위한 명령어입니다.

사용법은 아래와 같습니다.


>> figure; fplot(@(variable)function to plot, limits);


첫번째 입력으로는 함수의 변수와 출력하고자 하는 함수를 입력하면 됩니다. @(x)8.*x.^2+5.*cos(x)와 같이 말이죠.

이 때 변수는 x가 아닌 다른 어떤 문자로 해도 상관 없습니다.

limits 자리에는 대괄호를 이용하여 범위를 입력해주면 됩니다. [-3 3]과 같이 말이죠.

이렇게 입력하면 -3부터 3까지의 범위에 대하여 함수 y=8*x^2+5*cos(x)를 출력하라는 명령과 같습니다.

앞서 배웠던 line specifier를 fplot 함수에도 추가로 입력할 수도 있습니다.


Fig 3. The result of the fplot command


물론 굳이 fplot 함수를 사용하지 않아도, 원하는 범위의 element를 갖는 vector x를 선언하고 element-by-element 연산으로 각 element에 해당하는 함수의 결과값을 element로 갖는 vector y를 선언해주어 plot 명령어로 출력해도 상관없습니다.

각자 편한 방법을 선택하시면 되겠습니다.



2. 여러 그래프를 한 plot 안에 그리기


두 개 이상의 그래프를 하나의 plot에 그리는 방법에는 세 가지가 있습니다.


1) plot 명령어를 이용, 처음부터 여러 그래프를 입력으로 넣어주기


앞서 우리는 x에 대해 y를 출력하는 용도로 plot 함수를 사용했습니다만, 아래와 같이 사용할 수도 있습니다.


>> plot(x, y, u, v, t, h);


위 명령은 한 plot 안에 x에 대하여 y를 출력, u에 대하여 v를 출력, 그리고 t에 대하여 h를 출력하라는 명령입니다.

물론 line specifier를 추가할 수 있으며, 추가 시에는 원하는 위치(y에 대한 specifier일 경우 y뒤, h에 대한 specifier일 경우 h 뒤)에 추가해주면 됩니다.


Fig 4. The result of above command


2) hold on, hold off 명령어를 이용, plot 명령어로 그래프를 추가


이미 그려진 plot에 그래프를 추가하는 방법이며, 제가 자주 사용하는 방법이기도 합니다.

바로 hold on, hold off 명령어를 사용하는 것인데요.

hold on 명령어는 plot의 title, axis label 등을 유지시킨채로 추가적인 그래프 plot이 가능하게끔 하는 명령어입니다.

hold on을 입력한 뒤 원하는 그래프를 plot 함수로 그려주면 해당 plot에 그래프가 추가됩니다.

모든 추가작업이 끝나면 hold off 명령어를 입력하여 해당 plot의 수정을 마칩니다.



Fig 5, 6. The results of above command


만약 hold on 명령어 없이 plot을 추가로 입력한다면, 해당 figure window에 그려져있던 plot은 없어지고, 그 위에 새로운 plot이 덮어써집니다. 때문에 hold on 명령어를 이용하여 이전 그래프와 함께 그리거나, 아니면 figure 명령어를 이용하여 새 Figure window에 plot을 그리는 것입니다.


3) line 함수를 이용, 그래프를 추가


이 방법도 2)와 마찬가지로, 이미 그려진 plot에 그래프를 추가하는 방법입니다.

이미 생성된 plot이 있을 때,


>> line(x, y, 'PropertyName', PropertyValue);


위와 같은 명령어를 입력하면 동일한 plot 안에 그래프를 추가할 수 있습니다.

plot 함수와 입력이 거의 비슷한데요, line specifier를 'LineStyle', 'Color', 'Marker'로 분리하여 설정해주는 것 외에는 모두 동일합니다.

(plot 함수 또한 line specifier를 위와 같이 분리하여 설정 가능)


Fig 7. The result of above command



3. Plot 구성하기


이제 기본적인 plot 그리는 법을 배웠으니, 맨 처음에 언급했던 title, axis label 등을 추가하는 방법을 알아봅시다.


1) Axis label 추가


각 축이 의미하는 바가 무엇인지를 아래의 함수로 나타낼 수 있습니다.


>> xlabel('text as string'); % x축의 축 이름 설정 밑 나타내기

>> ylabel('text as string'); % y축의 축 이름 설정 및 나타내기


2) Title 추가


Plot의 제목을 아래의 함수로 나타낼 수 있습니다.


>> title('text as string'); % plot의 title 설정 및 나타내기


3) Legend 추가


Legend(범례)를 아래의 함수로 나타낼 수 있습니다.


>> legend('string1', 'string2', ...); % plot의 legned 나타내기


string 형태의 입력 수는 plot 내 그래프의 갯수와 동일해야 합니다.

또한 입력의 순서는 plot한 데이터의 순서이므로, 이에 유의하여 입력하시면 되겠습니다.


4) Plot 내 text label 추가


Plot 내에 text를 추가할 수 있습니다.


>> text(x1, y1, 'text as string'); % Plot의 (x1, y1) 위치에 text 나타내기

>> gtext('text string'); % 사용자가 마우스로 지정하는 위치에 text 나타내기. 실행시 마우스로 위치 지정



Title, axis label, legend, text label의 글꼴, 글자 크기 등을 설정할 수 있으며, 첨자 처리나 그리스 문자를 추가할 수도 있습니다.


 \bf

 볼드 처리(굵게)

 \it

 이탈릭 처리(기울여서)

 \rm

 일반 폰트

 \fontname{fontname to use}

 특정한 폰트 사용

 \fontsize{fontsize to use}

 폰트 크기 변경
Table 5. Modifiers for font set


위 modifier들은 각 함수의 string형 입력의 첫부분에 덧붙여주면 됩니다.


>> title('\fontname{Arial}Light Intensity as a Function of Distance');


위와 같이 선언하면 title의 모든 text가 Arial체로 설정됩니다.

특정 부분만 설정하고 싶을 경우에는 원하는 부분을 modifer와 함께 중괄호({ })로 묶어주면 됩니다.


>> title('{\fontname{Arial}fontsize{20}Light Intensity} as a Function of Distance');


text 내에 첨자를 추가할 경우에는 _(아랫첨자) 또는 ^(윗첨자)를 이용하면 각 modifier 직후에 나오는 문자는 첨자로 출력됩니다.

여러 문자를 첨자로 설정하고 싶은 경우에는 각 modifier 뒤에 원하는 단어를 중괄호({ })로 묶어주면 됩니다.


아래는 추가할 수 있는 그리스 문자들입니다.


 \alpha

 α

 

 \Phi

 Φ

 \beta

 β

 

 \Delta

 Δ

 \gamma

 γ

 

 \Gamma

 Γ

 \theta

 θ

 

 \Lambda

 Λ

 \pi

 π

 

 \Omega

 Ω

 \sigma

 σ

 

 \Sigma

 Σ

Table 6. Modifiers for Greek characters


plot formatting을 위한 함수들에도 plot 함수와 같이 PropertyName과 PropertyValue를 추가로 입력할 수 있습니다.

아래는 추가 가능한 property들 입니다.


 Rotation

 텍스트의 방향을 설정

 ˚단위의 수 입력 (default: 0)

 FontAngle

 텍스트를 기울이거나 일반 폰트로 결정

 normal / italic (default: normal)

 FontName

 특정한 폰트 사용

 사용 가능한 font 이름을 string형으로 입력

 FontSize

 텍스트의 사이즈 설정

 포인트 단위의 수 입력 (default: 10)

 FontWeight

 텍스트의 굵기 설정

 light / normal / bold (default: normal)

 Color

 텍스트의 색 설정

 Table 2 참고

 BackgroundColor

 텍스트 박스의 배경색을 설정

 Table 2 참고

 EdgeColor

 텍스트 박스의 윤곽선 색을 설정

 Table 2 참고 (default: None)

 LineWidth

 텍스트 박스의 윤곽선 두께를 설정

 포인트 단위의 수 입력 (default: 0.5)

Table 7. Properties for plot formatting commands


5) Axis 관련 함수


다른 설정 없이 plot 함수를 사용하여 그래프를 그릴 경우, MATLAB에서는 axis의 범위를 최솟값부터 최댓값 사이로 설정하여 plot 합니다. 하지만 때때로 원하는 범위를 설정하고 싶을 경우도 있을 것입니다.


>> axis([xmin, xmax, ymin, ymax]); % x축의 범위를 xmin~xmax, y축의 범위를 ymin~ymax로 설정하여 plot

>> axis equal; % 두 axis의 간격을 동일하게 설정

>> axis square; % 두 axis의 길이를 동일하게 성정

>> axis tight; % axis의 범위를 data의 범위와 동일하게 설정


위의 command 중 적절한 것을 선택하여 사용하시면 원하는 대로 plot을 수정할 수 있습니다.


6) Grid(격자) 추가


plot 내에 격자를 추가할 수도 있고, 다시 없앨 수도 있습니다.

아래의 명령어를 사용하면 됩니다.


>> grid on; % grid 추가

>> grid off; % grid 삭제



여섯 가지의 plot formatting 함수에 대해서 살펴봤는데요, 당연히 이 모든 함수와 property들을 외울 필요는 없습니다.

필요에 따라 검색하여 찾아보시면 되고, 사실 앞으로 plot에 있어서 사용하지 않을 기능도 많이 있습니다.

몇 가지만 추려서 예제로 확인해보도록 하겠습니다.


바로 밑에 결과를 첨부하였지만, 확인하시기 전에 스크립트를 읽어가시면서 결과를 예측해보시기 바랍니다.


Fig 8. Example 1: Plot the light intensity data to a distance.


Fig 9. The result of example 1



4. 로그 눈금을 사용하는 plot


종종 일반적인 axis가 아닌 로그(log) 눈금을 갖는 axis를 이용하여 plot을 할 경우가 있을 것입니다.

당연히 MATLAB에는 그런 상황을 위한 command를 갖추고 있습니다.


>> semilogy(x, y); % y축이 로그 눈금(밑은 10)을 갖는 2D 평면에 y를 x에 대해서 plot

>> semilogx(x, y); % x축이 로그 눈금(밑은 10)을 갖는 2D 평면에 y를 x에 대해서 plot

>> loglog(x, y); % x축과 y축 모두가 로그 눈금(밑은 10)을 갖는 2D 평면에 y를 x에 대해서 plot


아래의 예제를 통해 확인해봅시다.


Fig 10. Example 2: Plot y=2^(-0.2x+10) on various 2D planes 


Fig 11. The result of example 2


차이를 쉽게 확인하실 수 있겠습니다.

주의하실 점은, 로그 눈금을 이용할 때에는 0 또는 음수를 표현할 수 없다는 것입니다.



5. Error bar


Data 분석에 2D plot을 주로 사용하는 만큼, error를 함께 표시해야하는 경우도 많을 것입니다.

당연히 MATLAB에는 error bar를 표시해주는 함수를 제공하고 있습니다.


>> errorbar(x, y, yErr); % y를 x에 대해서 plot, i번째 data point에서 error가 yErr(i)인 error bar를 출력

>> errorbar(x, y, u, l); % y를 x에 대해서 plot, i번째 data point에서 upper error가 u(i), lower error가 l(i)인 error bar를 출력


당연히 x, y, yErr 또는 x, y, u, l은 size가 동일한 vector여야 합니다.


아래 예제를 마지막으로 오늘의 포스팅을 마치겠습니다.


Fig 11. Example 3 for error bar test and the result



다음 포스팅에서는 히스토그램, 극좌표 등 다양한 2D plot에 대해서 소개하도록 하겠습니다.

항상 감사합니다.




example1_180726.m

example2_180726.m

example3_180726.m




Comments