Notice
Recent Posts
Recent Comments
Link
관리 메뉴

뛰는 놈 위에 나는 공대생

[MATLAB] Figure 그릴 때 유용한 명령어 및 기능 모음 본문

프로그래밍 Programming/매트랩 MATLAB

[MATLAB] Figure 그릴 때 유용한 명령어 및 기능 모음

보통의공대생 2022. 2. 24. 21:19

MATLAB에서 결과를 plot하고 싶을 때 유용한 기능들을 모아놓고 쓰려고 기록하는 글.

 

1. Plot할 때 디폴트 속성 지정하기

 

plot을 많이 쓰면 일일이 plot의 디테일을 지정해주는 게 번거롭고 귀찮다.

그럴 때는 아예 figure 디폴트 속성을 지정해놓으면 된다.

 

내가 자주 쓰는 명령은 다음과 같다.

 

set( groot, 'defaultLineLineWidth', 1.5 ) ; % plot line 두께 지정
set( groot, 'defaultAxesXGrid', 'on' ) ; % x축 방향으로 grid 생성
set( groot, 'defaultAxesYGrid', 'on' ) ; % y축 방향으로 grid 생성
set( groot , 'defaultAxesFontSize', 12 ); % 축에 있는 글씨 크기 지정

 

groot은 default 속성에 접근하기 위해 무조건 필요하다. (groot는 그래픽스 root 객체라고 한다. 자세한 내용은 https://kr.mathworks.com/help/matlab/ref/groot.html )

 

그래픽스 root 객체 - MATLAB groot - MathWorks 한국

이 예제의 수정된 버전이 있습니다. 사용자가 편집한 내용을 반영하여 이 예제를 여시겠습니까?

kr.mathworks.com

 

 

그 다음 argument인 'default ~~~'는 디폴트 객체 속성(그래픽스 객체 속성) 이름을 집어넣어줘야 하는데 어떻게 그 이름을 알 수 있을까?

 

규칙은 다음과 같다.

 

  • 단어 default
  • 객체 유형(예: Line)
  • 속성 이름(예: LineWidth)

 

저 세 개가 조합되어서 'defaultLineLineWidth'이 된다.

 

그러면 이제 default는 무조건 들어가고, 객체 유형속성 이름을 찾으면 되겠다는 생각이 들 것이다.

 

이 링크를 들어가면 그래픽스와 관련된 온갖 객체들을 살펴볼 수 있다.

https://kr.mathworks.com/help/matlab/graphics-object-properties.html?s_tid=CRUX_lftnav 

 

그래픽스 객체 속성 - MATLAB & Simulink - MathWorks 한국

다음 MATLAB 명령에 해당하는 링크를 클릭했습니다. 명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.

kr.mathworks.com

 

 

위 링크에 들어가 원시 객체(primitive objects)에서 Line 속성에 들어가면 다음과 같다. (아래 링크는 Line 속성을 찾을 때 나오는 링크)

https://kr.mathworks.com/help/matlab/ref/matlab.graphics.primitive.line-properties.html

 

원시 선의 모양과 동작 - MATLAB - MathWorks 한국

R2020a부터는 UIContextMenu 속성을 설정하거나 가져오는 것이 권장되지 않습니다. ContextMenu 속성을 대신 사용하십시오. 이 속성은 동일한 유형의 입력값을 받고 UIContextMenu 속성과 같은 방식으로 동작

kr.mathworks.com

나는 지금 (Primitive objects 중) Line에서 LineWidth라는 속성을 선택할 것이므로

default + Line + LineWidth

로 이름을 만들면 된다.

 

이렇게 규칙만 알고 있으면 원하는 기능을 찾을 수 있을 것이다.

내가 주로 쓰는 default 속성 명령은 다음 글에 올려놓았으니 참고하면 좋다.


2. Figure 크기 설정하기

 

내가 만약 subplot을 사용해서 한 figure에 여러 개 그림을 그리고 싶다면 MATLAB의 기본 창 크기로는 너무 작다는 생각이 들 것이다. 여러 Figure를 만들고 그 안에 subplot을 여러 개 그리는 것까지는 좋은데, 막상 그 plot을 살펴보려고 Figure를 키우는 행동을 반복적으로 해야하는 불편함이 있다.

 

따라서 Figure의 크기를 지정하는 코드가 필요하다.

 

set( gcf, 'Position', [10 10 1000 800] ) ;

gcf는 현재 열린 figure에 대한 핸들이다. 핸들은 figure에 접근할 수 있는 통로라고 생각하는 게 편하다.

 

이 'Position'이 Figure의 크기를 정해주는 속성이다. 'Position' 옆에 있는 벡터는 아래와 같은 의미를 가지고 있다.

 

[ left bottom width height ]

= [ 모니터의 왼쪽에서부터 figure의 왼쪽까지의 거리, 모니터의 아래쪽으로부터 figure의 아래쪽까지의 거리, figure의 왼쪽 오른쪽 사이 거리, figure의 위 아래 사이 거리 ]

 

즉 벡터의 첫 번째, 두 번째 element는 모니터에서 창을 어디에 띄울 것인지 결정하고, 세 번째, 네 번째 element는 창의 너비높이를 결정한다. 픽셀 단위라서 직관적으로 크기를 결정하기는 어렵겠지만 디스플레이 크기를 고려해서 정하면 좋다. (나의 경우에는 1920X1080이므로 당연히 width, height는 각각 1920, 1080보다는 작아야한다.)

 

 

3. Subplot를 활용하기

 

여러 개의 plot을 나란히 늘어놓고 확인해보고 싶을 때가 있다. 물체의 움직임에 대해 location, velocity, acceleration을 한 화면에 보고 싶은 경우와 같이 말이다.

 

Figure 하나에 plot 하나씩만 그리면 figure 창이 너무 많이 생겨서 불편할 뿐더러 그래프를 볼 때도 일일이 자리를 배치해줘야해서 번거롭다.

 

따라서 figure에 여러 그래프를 그리는 방식을 취한다. (hold on은 한 plot 위에 다른 plot을 겹치는 방식이므로 이런 경우 제외)

 

문법 자체는 간단하다. MATLAB의 subplot을 검색하면 알 수 있듯이 창에서 M by N으로 격자를 내고 위치를 지정해줌으로써 해결하는 것인데 이 때 위치는 가로가 먼저이고 가로줄이 끝나면 그 다음 줄로 넘어가면서 숫자를 매긴다.

figure;
subplot(2,3,1); % 2(row수)x3(column수) 격자에서 첫 번째 위치
plot(x,y);

아래 그림을 보면 그림에 써놓은 숫자처럼 가로줄 먼저 순서가 매겨진다.

 

 

그런데 이런 subplot에는 치명적인 문제점이 있다. 위 그림과 같이 여백이 끔찍하게 넓다.

이 여백을 줄이려고 여러 방법을 찾아봤는데, 직접 subplot의 객체를 받아서 위치를 지정하는 방법이 있었다.

하지만 이 방법은 subplot을 내 마음대로 늘리고 싶을 때 각각의 위치를 지정해줘야하므로 매우 번거롭다.

 

또는 다른 사람들이 만들어놓은 함수를 이용하는 방법도 있다.

https://kr.mathworks.com/matlabcentral/fileexchange/3696-subaxis-subplot

 

Subaxis - Subplot

Use HTML jargon for multi axis layout.

kr.mathworks.com

https://kr.mathworks.com/matlabcentral/fileexchange/39664-subtightplot

 

subtightplot

Asymmetric subplots with variable inner gaps and outer margins.

kr.mathworks.com

 

위의 사람들이 친절하게 만들어놓은 것을 써볼 수 있을 것이다.

 

그러나 2019b 버전 이후로 MATLAB에서 만들어놓은 함수가 있다.

그건 tiledlayout이라고 해서 subplot과 유사하지만 각 plot끼리의 거리를 좁히는 기능이 있다는 것에서 장점이 있다.

 

https://kr.mathworks.com/help/matlab/ref/tiledlayout.html

 

타일 형식 차트 레이아웃 만들기 - MATLAB tiledlayout - MathWorks 한국

타일 형식 차트 레이아웃을 만들 때 TileSpacing 속성과 Padding 속성 중 일부가 다른 결과를 제공하거나 새 이름을 갖습니다. 새로운 TileSpacing 옵션은 'loose', 'compact', 'tight', 'none'입니다. 새로운 Padding

kr.mathworks.com

 

subplot보다 좀 더 유연하게 대응할 수 있는게, subplot은 무조건 격자를 먼저 지정하고 시작해야 하지만 위의 함수는 꼭 격자 크기를 지정하지 않아도 된다.

(나중에 사용해보고 예시를 같이 첨부하겠음)

 

 

4. Figure에 있는 UI를 현명하게 이용하기

 

plot을 다 하고 나서 막상 figure를 열어보면 만족스럽지 않을 수 있다. 막상 Run을 눌러놓고, plot에 추가해야할 속성을 깜빡할 수도 있기 때문이다.

 

내가 figure 창에서 해본 것은, 여러 개 그려진 plot 중 하나를 골라서 지우는 것, plot의 색상과 두께를 지정하는 것이 있다.

 

 

대충 그래프를 그려놓고 위 그림에서 보이는 것처럼 화살표 모양을 클릭하면 다음과 같이 plot 창 주변에 파란 네모가 생긴다.

이 때 내가 빨간색 그래프를 초록색으로 바꾸고 두께도 더 두껍게 바꾸고 싶다고 하자.

 

빨간색 그래프를 클릭하고 마우스 오른쪽을 클릭하면

 

 

이렇게 뜨고 여기서 다양한 속성을 바꿔줄 수 있다.

 

 

 

이런 식으로 plot을 후속처리 해줄 수 있다. 보통은 코드 상에서 plot을 고치겠지만, 가끔은 plot 그리는 게 반복적으로 일어나다보니 특정 plot만 조금 바꿔주고 싶을 때 이렇게 할 수도 있다.

 


 

Comments