이 글은 plt.legend 함수를 통해 그래프 범례 모양을 내 마음대로 커스터마이즈하고 싶은 분들을 위한 글입니다. 이를 위한 label, loc, ncol, fontsize, frameon, shadow 총 6가지의 옵션과 기타 옵션들에 대해서 예시와 함께 설명하며, 실습합니다.
plt.legend는 그래프의 범례를 표기할 때 사용하는 함수입니다. 다음과 같이 matplotilb 라이브러리를 불러오면 사용이 가능하죠.
import matplotlib.pyplot as plt
plt.legend 함수에는 다양한 옵션들이 있는데, 이 옵션들을 사용하면 범례의 위치, 스타일, 크기 등을 커스터마이즈 할 수 있습니다. 주요 옵션에는 다음과 같은 것들이 있습니다.
목차
이 포스팅에서는 plt.legend의 주요 속성인 위 6가지 속성을 사용하는 방법을 예시와 함께 알아보겠습니다. 글 마지막에는 끝까지 읽으신 분들을 위한 선물을 남겨두었습니다 :)
1. 범례 텍스트 설정 : label
범례를 표기하기 위해서는 그릴려고하는 그래프 코드에 label 옵션을 넣어주어야 합니다. 이 옵션은 plt.legend에 사용하는 것이 아닌 것이기 때문에 주의하시길 바랍니다. 다음은 예시 코드와 그래프입니다.
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, label='sin(x)')
plt.legend()
plt.plot으로 sin(x) 그래프를 그렸는데, 여기에 label옵션을 사용하지 않고, plt.legend 함수를 사용하면 오류가 발생하면서 범례가 표기되지 않습니다. 따라서 그래프 코드에 label 옵션을 반드시 넣어주어야 하고, 원하는 텍스트를 설정해 주면 위 이미지의 오른쪽 위와 같이 범례가 표기됩니다.
2. 범례 위치 조정 : loc 옵션
loc 옵션을 사용해서 범례 위치를 조정할 수 있습니다. 옵션을 사용하지 않으면 기본적으로는 'best'옵션이 적용됩니다. 'best'옵션이란, Matplotlib가 자동으로 데이터와 겹치지 않는 최적의 위치를 찾아서 범례를 배치하는 것입니다.
plt.legend(loc='best') # plt.legend()와 같은 결과
하지만 이 옵션을 사용하면, 복잡한 그래프를 그릴 때는 항상 "최적"의 위치에 설정되지는 않는다는 문제가 있습니다. 따라서 이럴 경우엔 loc 옵션을 통해서 직접 위치를 조정해주어야 하죠. 예시를 살펴보겠습니다.
이렇게 옵션의 속성값을 어떻게 입력해 주느냐에 따라 위치를 직접 조정해 줄 수 있습니다. 아래는 loc 옵션에서 사용할 수 있는 속성값을 정리한 표입니다. Location Code보다는 Location String이 직관적이고, 딱히 외우지 않아도 사용할 수 있으니 Location String을 사용하는 것을 추천드립니다.
Location String | Location Code |
'best' (Axes only) | 0 |
'upper right' | 1 |
'upper left' | 2 |
'lower left' | 3 |
'lower right' | 4 |
'right' | 5 |
'center left' | 6 |
'center right' | 7 |
'lower center' | 8 |
'upper center' | 9 |
'center' | 10 |
범례 위치를 더 세밀하게 조정하는 방법
하지만 이 방법도 문제가 있는데요. 위치를 세밀하게 조정할 수 없다는 점이죠. 그래서 이보다 더 세밀하게 조정하는 방법도 알려드리겠습니다. 이때 사용하는 코드는 다음과 같습니다.
plt.legend(loc=(x축,y축))
이렇게 x축과 y축의 위치를 숫자로 나타내면 되는데, 이때 그래프의 크기는 1 x 1이라고 생각하고 위치를 조정하면 됩니다. 그러면 위 그래프와 같이 0,0 위치에는 왼쪽 아래, 1,1위치에는 오른쪽 위에 범례가 설정됩니다. 소수점 숫자를 사용하는 것도 가능하며, 음수 또는 1 이상의 숫자를 사용하는 것도 가능합니다.
이렇게 범례 위치를 조정하는 법에 대해서 알아보았습니다. 다음은 ncol 옵션에 대해서 알아보겠습니다.
3. 범례 열 개수 지정 : ncol 옵션
ncol 옵션을 사용하면, 범례의 열 개수를 지정할 수 있습니다. 기본 값은 1이며, 1로 지정했을 때는 아래와 같이 1열로 범례가 설정되는 걸 알 수 있습니다.
plt.legend(ncol=1) # plt.legend()와 같은 결과
그래프가 3개 일 때 ncol을 2로 지정하면, 아래와 같이 범례가 표기됩니다. 그래프가 3개인데, ncol을 4 이상의 숫자로 설정하면 자동으로 3개의 열로 맞춰지며, 숫자 0을 넣으면 오류가 발생합니다.
4. 범례 텍스트 사이즈 조정 : fontsize
fontsize 옵션을 통해 텍스트 사이즈를 설정할 수 있습니다. 기본값은 medium(=10pt)으로 설정되어 있습니다. small, larger, medium과 같이 문자로 설정할 수도 있고, 세밀한 크기를 조정하려면 포인트 크기 숫자를 입력해 주면 됩니다.
fontsize 옵션의 문자들을 폰트 크기로 나타내면 다음과 같으니 참고해 주세요.
Fontsize String | Fontsize Number(폰트 크기) |
small | 8.33pt |
medium | 10pt |
larger | 12pt |
x-small | 6.94pt |
xx-small | 5.79pt |
x-larger | 14.4pt |
xx-larger | 17.28pt |
5. 범례 테두리 설정 : frameon, shadow
범례 테두리도 커스터마이즈 하는 것이 가능합니다. frameon 옵션을 통해서 테두리를 제거할 수 있고, shadow 옵션을 통해서 그림자를 만들 수도 있습니다. 기본값은 frame=True, shadow=False입니다.
frameon과 shadow 옵션은 불리언 값(즉, 'True' 또는 'False')을 사용하여 설정할 수 있습니다. True는 숫자 1로, False는 숫자 0으로 대치가 가능하며, 이 외에 다른 값을 넣으면 오류가 뜨거나 True로 적용이 됩니다.
또한 위 이미지의 4번째 그래프를 보면, 기본값과 반대로 frame=False, shadow=True로 설정했는데, 2번 그래프와 범례가 똑같이 표기되는 걸 볼 수 있습니다. 이로써 우리는 shadow 옵션은 frameon이 True일 때만 적용이 된다는 걸 알 수 있습니다.
6. 기타 옵션들
- title : 범례의 제목을 설정합니다.
- title_fontsize : 범례 제목의 글자 크기를 설정합니다.
- bbox_to_anchor : 범례가 위치할 상자의 좌표를 설정합니다. 주로 'loc' 옵션과 함께 사용됩니다.
- borderpad : 범례 상자의 패딩을 설정합니다.
- labelspacing : 범례 내의 레이블 간의 간격을 설정합니다.
- handlelength : 범례의 핸들(선 또는 마커 등)의 길이를 설정합니다.
- handletextpad : 범례 핸들과 텍스트 레이블 사이의 간격을 설정합니다.
- borderaxespad : 범례와 축 사이의 간격을 설정합니다.
- columnspacing : 다중 열 범례에서 열 사이의 간격을 설정합니다.
- prop : 텍스트 속성 설정
- ex)
- prop={'size': 12}: 폰트 크기를 12로 설정
- prop={'family': 'serif'}: 폰트 패밀리를 'serif'로 설정
- prop={'weight': 'bold'}: 폰트 굵기를 'bold'로 설정
- prop={'style': 'italic'}: 폰트 스타일을 'italic'으로 설정
위 옵션들을 적용한 예시 코드
plt.legend(
title='My Legend Title', #범례의 타이틀 설정
title_fontsize=16, #타이틀 폰트 크기 (16pt)
loc='upper left', #범례 위치
bbox_to_anchor=(1, 1), #범례의 위치가 시작하는 좌표 (오른쪽 위)
borderpad=2, # 범례 상자 크기
labelspacing=1, # 레이블간 간격
handlelength=3, # 핸들(sin, cos 텍스트 왼쪽 파랑색, 초록색 선)길이
handletextpad=2, # 핸들과 텍스트 사이 거리
borderaxespad=1, # 범례와 축 사이의 거리
columnspacing=2, # 2개의 핸들 사이의 거리 (ncol2로 설정했을때)
ncol=2,
fontsize='small',
frameon=True,
shadow=True,
prop={'weight': 'normal'} # 폰트 굵기를 'bold'로 설정
)
결과 그래프
여기까지 기타 옵션들까지 알아보았습니다 :) 엄청 간단한 함수인 줄 알았는데, 생각보다 옵션이 정말 많죠? 일반적으로 이런 기타 옵션들을 모두 사용할 일은 없지만, 그래프 모양이 중요한 논문에 들어가야 하는 그래프를 그리거나 굉장히 신경 써서 자료를 만들어야 할 때는 이러한 상세 옵션들까지 찾아보게 되죠.
이런 분들을 위해 아래에 제가 이 포스팅에서 예시로 사용한 그래프를 그린 코드를 첨부해 놓았습니다. 충분히 연습해 보시고, 만약 시간이 부족하거나 직접 하기엔 어려워서 대신 작업을 해줄 전문가가 필요하다면, 크몽 서비스를 이용해 보세요 :) 저는 크몽에서 논문 그래프 시각화 전문가로 활동하고 있습니다!
사용한 예시 코드 다운로드 받기
함께보면 좋은 글(시각화)
'데이터분석 > Seaborn, matplotlib' 카테고리의 다른 글
Seaborn 막대 그래프 7가지 종류 그리는 방법 (vs Matplotlib) (0) | 2023.10.27 |
---|---|
Matplotlib 막대 그래프 그리는 7가지 방법(errorbar, 100% 누적 바 등) (0) | 2023.10.16 |
Matplotlib Subplot 활용해서 그래프 여러개 그리는 3가지 방법 (0) | 2023.10.12 |
데이터 시각화를 하는 이유, 좋은 시각화 핵심 법칙 (0) | 2023.10.11 |
댓글