한 figure에 그래프를 워낙 많이 그리다보면 labeling이 중요하다. 이런 figure를 그리는 일들을 반복작업할 때 도움이 되는 팁들을 적고자 한다.
이 글은 일부 plot만 legend를 넣고 싶을 때 사용하는 방법에 대해 다룬다.
Plot에 Displayname을 지정하는 방법
이 질문은 구글에 검색하면 많은 답변들이 있지만 내가 제일 편한 방식은 다음과 같다.
plot을 그릴 때 'Displayname'을 지정할 수 있다. 이는 legend에 나올 이름을 지정하는 것이다. 예를 들면
x1 = 0:0.1:2*pi ;
x2 = 0:0.1:2*pi ;
y1 = sin(x1);
y2 = cos(x2);
figure;
plot(x1,y1,'Displayname','sine') ; hold on;
plot(x2,y2,'Displayname','') ;
legend('Location','best');
grid on;
다음과 같이 sine, cosine function을 그릴 때 보면
이렇게 sine function은 표기가 되고, displayname을 ''로 지정할 경우에는 아무 글씨도 나오지 않는다.
하지만 아예 주황색 plot은 legend에 나오지 않도록 하고 싶을 것이다.
다음과 같이 변경하면 된다.
x1 = 0:0.1:2*pi ;
x2 = 0:0.1:2*pi ;
y1 = sin(x1);
y2 = cos(x2);
figure;
plot(x1,y1,'Displayname','sine') ; hold on;
plot(x2,y2,'HandleVisibility','off') ;
legend('Location','best');
grid on;
두 번째 plot에서 'HandleVisibility'를 'off'로 설정한다. 이렇게 하면 아래처럼 legend에서 아예 사라진다.
MATLAB에서 제시한 방법 (plot의 핸들을 받아서 사용하는 방식)
이 방법 외에도 MATLAB help center를 가보면 다음처럼 하도록 되어있다.
x = linspace(0,pi);
y1 = cos(x);
p1 = plot(x,y1);
hold on
y2 = cos(2*x);
p2 = plot(x,y2);
y3 = cos(3*x);
p3 = plot(x,y3);
hold off
legend([p1 p3],{'First','Third'})
이렇게 하면 첫 번째, 세 번째 plot만 legend가 생성된다.
하지만 이 방법은 내가 선호하지 않았던 이유가 있는데, for문 안에서 반복적으로 그래프를 생성할 때 불리한 방식이라는 점이다.
계속해서 한 figure 안에 plot이 늘어나는데 저렇게 핸들을 추가하는 것이 번거로웠다.
아니면 저렇게 응용할 수 있게 하고자 코드를 다음처럼 수정할 수 있다.
hand = zeros(2,1) ;
name = cell(2,1) ;
name_set = ["first","second","third"] ;
n = 0 ;
x = linspace(0,pi);
figure ;
for i = 1:3
y = cos(i * x);
p = plot(x,y);
hold on;
if i ~= 2
n = n+1;
hand(n) = p ;
name{n} = char(name_set(i)) ;
end
end
legend(hand, name);
위 코딩의 결과
이 방식은 for문 안에서 hand라는 array에 plot에 대한 handle을 저장하고, legend로 사용할 이름을 cell array에 저장해서 나중에 for문이 끝나면 legend를 보이도록 하는 방식이다.
만약 for문에서 얼마나 많은 핸들이 저장될 지 알 수 없으면 미리 array 크기를 할당하지 않고 for문 안에서 증가하도록 할 수는 있지만 좋은 코딩방식은 아니다. (matlab에서는 미리 array 크기를 할당하고 그 안에 저장하는 것을 권장하고 있다.)
위 코딩에서 cell array는 string을 저장하지 않고 char만 저장하며, name_set은 이름을 저장하기 위해 string으로 저장했음에 주의해야한다. 즉, cell과 string 등 다양한 type을 헷갈리지 않고 잘 써야하기 때문에 번거롭게 느낄 것이다.
따라서 본인이 편한 방식에 따라서 처음에 소개한 방법을 쓰거나, 지금과 같은 방법 골라쓰면 된다.
참고 자료
https://kr.mathworks.com/help/matlab/ref/legend.html#bu_sz6u-1
좌표축에 범례 추가 - MATLAB legend - MathWorks 한국
legend 함수를 호출하고 레이블을 빈 문자형 벡터나 빈 string형이나 셀형 배열 또는 string형 배열의 빈 요소로 지정하면 해당 항목이 범례에서 생략됩니다. R2020b 이하 릴리스에서는 그런 항목이 범
kr.mathworks.com
그리고 여러 mathworks의 질문 문답들
'프로그래밍 Programming > 매트랩 MATLAB' 카테고리의 다른 글
[MATLAB] classic plot의 color 순서로 설정하기 (0) | 2022.09.26 |
---|---|
[MATLAB] 시작할 때 자동 실행되는 코드 (startup.m) (0) | 2022.09.05 |
[MATLAB] Function handle array 만들기 (0) | 2022.06.14 |
[MATLAB] 유용한 디폴트 default 속성 명령어 저장 (0) | 2022.06.05 |
[MATLAB] 3D plot을 그릴 때 주의할 점 : X,Y축 반전 (2) | 2022.05.20 |