본문 바로가기
데이터분석/Seaborn, matplotlib

plt.legend 옵션으로 그래프 범례 모양 커스터마이즈하기

by 코듀킹 2023. 10. 10.

이 글은 plt.legend 함수를 통해 그래프 범례 모양을 내 마음대로 커스터마이즈하고 싶은 분들을 위한 글입니다. 이를 위한 label, loc, ncol, fontsize, frameon, shadow 총 6가지의 옵션과 기타 옵션들에 대해서 예시와 함께 설명하며, 실습합니다.

 

plt.legend는 그래프의 범례를 표기할 때 사용하는 함수입니다. 다음과 같이 matplotilb 라이브러리를 불러오면 사용이 가능하죠.

 

import matplotlib.pyplot as plt

 

 

 

plt.legend 함수에는 다양한 옵션들이 있는데, 이 옵션들을 사용하면 범례의 위치, 스타일, 크기 등을 커스터마이즈 할 수 있습니다. 주요 옵션에는 다음과 같은 것들이 있습니다.

 

목차

  1. label
  2. loc
  3. ncol
  4. fontsize
  5. frameon, shadow
  6. 기타 옵션들

 

이 포스팅에서는 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.legend-범례표기-방법-label-코드사용

 

plt.plot으로 sin(x) 그래프를 그렸는데, 여기에 label옵션을 사용하지 않고, plt.legend 함수를 사용하면 오류가 발생하면서 범례가 표기되지 않습니다. 따라서 그래프 코드에 label 옵션을 반드시 넣어주어야 하고, 원하는 텍스트를 설정해 주면 위 이미지의 오른쪽 위와 같이 범례가 표기됩니다.

 


2. 범례 위치 조정 : loc 옵션

loc 옵션을 사용해서 범례 위치를 조정할 수 있습니다. 옵션을 사용하지 않으면 기본적으로는 'best'옵션이 적용됩니다. 'best'옵션이란, Matplotlib가 자동으로 데이터와 겹치지 않는 최적의 위치를 찾아서 범례를 배치하는 것입니다.

 

plt.legend(loc='best') # plt.legend()와 같은 결과

plt.legend-범례위치-기본값

 

 

하지만 이 옵션을 사용하면, 복잡한 그래프를 그릴 때는 항상 "최적"의 위치에 설정되지는 않는다는 문제가 있습니다. 따라서 이럴 경우엔 loc 옵션을 통해서 직접 위치를 조정해주어야 하죠. 예시를 살펴보겠습니다. 

 

plt.legend-범례위치-개인맞춤설정

 

이렇게 옵션의 속성값을 어떻게 입력해 주느냐에 따라 위치를 직접 조정해 줄 수 있습니다. 아래는 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축))

plt.legend-범례위치-세밀조정

 

이렇게 x축과 y축의 위치를 숫자로 나타내면 되는데, 이때 그래프의 크기는 1 x 1이라고 생각하고 위치를 조정하면 됩니다. 그러면 위 그래프와 같이 0,0 위치에는 왼쪽 아래, 1,1위치에는 오른쪽 위에 범례가 설정됩니다. 소수점 숫자를 사용하는 것도 가능하며, 음수 또는 1 이상의 숫자를 사용하는 것도 가능합니다. 

 

이렇게 범례 위치를 조정하는 법에 대해서 알아보았습니다. 다음은 ncol 옵션에 대해서 알아보겠습니다.

 


3. 범례 열 개수 지정 : ncol 옵션

ncol 옵션을 사용하면, 범례의 열 개수를 지정할 수 있습니다. 기본 값은 1이며, 1로 지정했을 때는 아래와 같이 1열로 범례가 설정되는 걸 알 수 있습니다.

plt.legend(ncol=1) # plt.legend()와 같은 결과

plt.legend-ncol-옵션-기본값

 

그래프가 3개 일 때 ncol을 2로 지정하면, 아래와 같이 범례가 표기됩니다. 그래프가 3개인데, ncol을 4 이상의 숫자로 설정하면 자동으로 3개의 열로 맞춰지며, 숫자 0을 넣으면 오류가 발생합니다.

 

plt.legend-ncol-옵션-상세설정

 


4. 범례 텍스트 사이즈 조정 : fontsize

fontsize 옵션을 통해 텍스트 사이즈를 설정할 수 있습니다. 기본값은 medium(=10pt)으로 설정되어 있습니다. small, larger, medium과 같이 문자로 설정할 수도 있고, 세밀한 크기를 조정하려면 포인트 크기 숫자를 입력해 주면 됩니다.

 

plt.legend-fontsize-옵션

 

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입니다.

 

plt.legend-frameon-옵션과-shadow-옵션

 

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'로 설정
)

 

결과 그래프

plt.legned-기타옵션들-적용

 

 

여기까지 기타 옵션들까지 알아보았습니다 :) 엄청 간단한 함수인 줄 알았는데, 생각보다 옵션이 정말 많죠? 일반적으로 이런 기타 옵션들을 모두 사용할 일은 없지만, 그래프 모양이 중요한 논문에 들어가야 하는 그래프를 그리거나 굉장히 신경 써서 자료를 만들어야 할 때는 이러한 상세 옵션들까지 찾아보게 되죠. 

 

이런 분들을 위해 아래에 제가 이 포스팅에서 예시로 사용한 그래프를 그린 코드를 첨부해 놓았습니다. 충분히 연습해 보시고, 만약 시간이 부족하거나 직접 하기엔 어려워서 대신 작업을 해줄 전문가가 필요하다면, 크몽 서비스를 이용해 보세요 :) 저는 크몽에서 논문 그래프 시각화 전문가로 활동하고 있습니다!

 

 

사용한 예시 코드 다운로드 받기

범례모양_커스터마이즈.ipynb
0.81MB

 

 

함께보면 좋은 글(시각화)

댓글