Annotate – Figure에 주석을 달자

Matlab의 최종 결과물은 데이터 값 자체도 중요하지만,
이 결과를 그래프를 통해 한 눈에 보기 좋게 표현하는 것도 중요합니다.
이를 위해서 필요한 기능이 바로 주석(Annotating)과 관련된 함수(기능)들입니다.

matlab에서 그래프에 대한 주석 기능은 주로 figure 창 내의 툴바를 중심으로 설명하고 있습니다.
하지만 이 방법은 데이터 값이 변하지 않고, 처음 그려낸 결과가 최종 결과 일 때 편리하다고 할 수 있습니다.
데이터의 결과가 바뀔 때 마다(변수나 수치 변경에 의해) 새로 주석을 달아야 한다면, 상당히 불편한 일입니다.

저는 함수들을 이용해서 m-file 실행시 바로 주석이 달릴 수 있도록 설명하겠습니다.

주석에 대한 기능을 사용하기 전에 기본으로 사용할 그래프를 하나 그리도록 하겠습니다.
Sin 파형을 1주기 동안 그리도록 아래와 같이 명령을 수행했습니다.

t=0:0.01:2*pi;
y=sin(t);
plot(t,y)
axis([0 2*pi -1 1])

위 명령들을 수행하면 기본적인 파형이 그려집니다.

이제 본격적으로 주석을 달기 위한 함수들을 살펴보겠습니다.
Label과 Title을 적어주겠습니다.(Insert -> xlabel, ylabel, title 을 이용하셔도 됩니다.)

xlabel(‘Time(sec)’);
ylabel(‘Value’);
title(‘Sin Function’,’FontSize’,14);

사실 위 코드를 직접 m-file에 같이 작성하는 방법도 있지만,
배치에 대한 부분이나 글자 크기에 대한 짐작이 필요할 수 있습니다.

이 때는 Insert->에서 기능을 수행하고, figure 위에서 마우스 우측 버튼을 누른 뒤,
Show M-Code를 수행해서 코드를 복사해서 이용하셔도 됩니다.

사실 이 방법을 응용하시면 툴바에서 이용한 기능들이 바로 m-code화 되기 때문에
제가 아래 설명하려는 것들이 필요 없을 수도 있습니다. ^^;;;

이 글은 어떻게 생각하면 주석을 위한 함수 자체의 설명 보다는
응용에 대한 설명을 하고자 했다는게 맞을 것 같습니다.

먼저, 이 삼각함수 그래프에서 최대값과 최소값에 점을 찍고 화살표를 그린 뒤
텍스트 박스를 이용해서 “최대값”, “최소값”이 입력되도록 해보겠습니다.
최대, 최소 값을 찾아야 하기 때문에 max 함수와 min 함수를 사용해야 합니다.

ymax=max(y);
ymin=min(y);
tmax=t(find(y==ymax)); %y가 최대값을 가질 때 t의 값
tmin=t(find(y==ymin));  %y가 최소값을 가질 때 t의 값

이 값들을 이용해서 주석을 달아봅시다.

hold on
plot(tmax,ymax,’or’,’markersize’,5); %최대값에 마커 표시
plot(tmin,ymin,’or’,’markersize’,5); %최소값에 마커 표시
plot_pos=get(gca,’Position’);        %실제 Plot 되는 영역을 얻음
xlim=get(gca,’xlim’);                 %get x-axis limit
ylim=get(gca,’ylim’);                 %get y-axis limit
xaxis=abs(xlim(2))+abs(xlim(1));
yaxis=abs(ylim(2))+abs(ylim(1));
marker1=[(tmax+abs(xlim(1)))/xaxis (ymax+abs(ylim(1)))/yaxis];%lim에 대한 max 비
marker2=[(tmin+abs(xlim(1)))/xaxis (ymin+abs(ylim(1)))/yaxis]; %lim에 대한 min 비
annotation(‘textarrow’,[plot_pos(1)+plot_pos(3)*marker1(1) plot_pos(1)+plot_pos(3)*marker1(1)],…
[plot_pos(2)+plot_pos(4)*marker1(2)-0.05 plot_pos(2)+plot_pos(4)*marker1(2)],’TextEdgeColor’,’none’,’String’,{‘최대값’});
annotation(‘textarrow’,[plot_pos(1)+plot_pos(3)*marker2(1) plot_pos(1)+plot_pos(3)*marker2(1)],…
[plot_pos(2)+plot_pos(4)*marker2(2)+0.05 plot_pos(2)+plot_pos(4)*marker2(2)],’TextEdgeColor’,’none’,’String’,{‘최소값’});

점을 찍어야 하기 때문에 hold on을 해주었습니다.
값 위치에 큰 점을 하나 찍어주고, textarrow를 이용해서 이름을 표시했습니다.
위치에 대한 비율을 얻기 위해 “get(gca,’propertyname’)”을 사용하였습니다.


최종 결과로 얻어진 그래프는 위와 같습니다.
함수를 바꾸거나 축을 바꾸어도 최대값과 최소값을 향해 주석이 달려있는 것을 알 수 있습니다.
물론 지금 예시로 든 함수는 단순하기 때문에 쉽지만, 이런식으로 하면 된다는 예를 보이기 위함입니다.

p.s. 사실 위 코드를 짜면서 생각보다 비율에 대한 계산이 많아 비효율적일 수 있다는 생각도 들었습니다.
하지만 여러개의 변수에 대해서 그래프를 반복그려야 하고, 그 때마다 주석이 필요하다면
사람의 손을 덜어줄 수 있는 방법이라고 생각합니다. ^^.(위의 수행 결과물 m-file 첨부합니다.)

매트랩파일(.m)

* 참고자료: MATLAB User Guide

You may also like...

5 Responses

  1. YUYU 댓글:

    이렇게도 되는구나
    방법 찾느라 고생좀 했는데
    숙오~ ㅋㅋ

  2. nolajo 댓글:

    매트랩관련해서 님 블로그를 잘 보고 있습니다. 그런데 제가 먼가를 하다가 막히는 부분이 있어서
    이렇게 댓글로 질문드립니다.

    예를 들어
    데이터의 전력스펙트럼을 구했을때
    최대값은 max를 통해서 최대 크기를 알수 있습니다.
    그 최대 크기값의 위치가 (x,y)로 좌표점을 갖고 있는데, 여기서 x축은 주파수 인거고, y축은 magnitude 가 되겠죠.

    그런데 최대점의 x축값을 저장하고 싶은데 방법을 잘 모르겠네요.
    (즉, 최대 크기일때 주파수값을저장하고싶은것)

    혹시 아시는지요??

    • downright 댓글:

      말씀하신 부분은 위의 코드에서 아래와 같습니다.

      tmax=t(find(y==ymax));

      y가 최대의 값을 갖는 경우의 index 번호를 find 함수로 찾은 후,
      t에 index 번호를 대입시키면 해당 t의 값을 구할 수 있습니다.

  3. 댓글:

    m파일 에러뜨던데요;;

    ??? annotate[1]
    |
    Error: Unbalanced or unexpected parenthesis or
    bracket.

댓글 남기기