Matplotlib에서 플롯 영역 밖에 범례 위치하기
Published on
데이터 시각화에서 범례 위치를 관리하는 것은 종종 어려운 작업일 수 있습니다. 오늘은 Matplotlib라는 인기있는 데이터 시각화 라이브러리를 사용하여 플롯 영역 밖에 범례를 효과적으로 배치하는 방법을 설명하겠습니다. 자 그러면 범례가 데이터를 방해하지 않도록 해봅시다!
문제 이해하기
플롯의 범례는 데이터 해석에 필수적인 요소이지만 종종 가치 있는 플롯 공간을 차지하여 읽기 어려운 플롯을 만들어내는 문제를 일으킵니다. 이 문제의 대표적인 해결책 중 하나는 범례를 플롯 영역 밖으로 이동시키는 것입니다.
Matplotlib 솔루션
데이터 시각화에 대한 강력하고 다양한 파이썬 라이브러리인 Matplotlib은 플롯 영역 밖에 범례를 배치하는 간편한 솔루션을 제공합니다.
개념을 설명하기 위해 우선 Matplotlib의 pyplot
API를 사용하여 간단한 라인 플롯을 생성해봅시다:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend()
plt.show()
위 코드에서는 sin(x)
와 cos(x)
두 개의 라인 플롯이 있습니다. legend()
함수 호출은 자주 일부 데이터를 가리는 플롯 내부에 범례를 추가합니다.
플롯 밖에 범례 배치하기
범례를 플롯 밖으로 이동시키기 위해서는 legend()
함수의 bbox_to_anchor
매개변수를 사용할 수 있습니다. 이 매개변수는 범례의 경계 상자 위치를 플롯의 좌표축에 대한 상대적인 위치로 지정할 수 있습니다.
다음은 플롯 오른쪽에 범례를 배치한 예입니다:
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.show()
이 코드에서 bbox_to_anchor=(1.05, 1)
은 범례의 경계 상자를 좌표축 바깥에 놓도록 합니다. loc='upper left'
는 bbox_to_anchor
에서 지정된 좌표에 놓일 범례 상자의 지점을 지정합니다.
범례 조정하기
기본 위치 이외에도, 범례를 더욱 잘 맞추기 위해 몇 가지 조정을 할 수 있습니다.
폰트 크기 줄이기
레전드 텍스트의 폰트 크기를 줄이려면:
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', prop={'size': 6})
plt.show()
이 코드에서 prop={'size': 6}
은 레전드 텍스트의 폰트 크기를 줄여 레전드 상자의 전체 크기를 줄인다.
레전드 방향 바꾸기
수평 레전드를 원한다면 ncol
매개 변수를 사용하여 열의 수를 지정하면 된다:
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(0.5, -0.15), loc='upper center', ncol=2)
plt.show()
Matplotlib 레전드 배치 제어
Python으로 데이터 시각화를 하는 과정에서 매번 수행되는 작업 중 하나는 명확하고 간결하며 매력적인 플롯을 만드는 것이다. 이를 달성하는 중요한 부분은 Matplotlib에서 레전드를 올바르게 배열하는 것이다. 이 포괄적인 가이드는 그것을 달성하는 데 사용할 수 있는 다양한 방법을 안내할 것이다.
bbox_to_anchor: 더 나은 레전드 배치를 위한 열쇠
Matplotlib 플롯 박스 바깥쪽에 레전드를 위치시키는 여러 가지 방법이 있다. 그 중 가장 유연하고 효율적인 방법 중 하나는 bbox_to_anchor
키워드 인수를 사용하는 것이다. 이 강력한 기능을 활용하여 플롯 미학을 개선하는 방법을 자세히 살펴보자.
bbox_to_anchor
의 기본적인 적용 방법을 예로 들어보자. 다음 예제에서는 레전드가 축 경계 상자 바깥쪽으로 약간 이동하는 것을 보여준다.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in range(5):
ax.plot(x, i * x, label='$y = %ix$' % i)
ax.legend(bbox_to_anchor=(1.1, 1.05))
plt.show()
위 코드 스니펫에서 레전드는 축 경계 상자의 오른쪽 위 모서리 바로 오른쪽과 약간 위쪽에 전략적으로 배치되어 있으므로 플롯을 가려지지 않으면서 쉽게 볼 수 있다.
축소의 힘을 해제: 최적의 레전드 위치 설정을 위한 또 다른 열쇠
레전드를 플롯 밖으로 더 이동시키려는 경우, 현재 플롯의 크기를 축소하는 것도 고려해 볼 수 있다. 다음의 코드 예를 살펴보자.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in range(5):
ax.plot(x, i * x, label='$y = %ix$'%i)
# 현재 축 크기 20% 축소
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
# 축 우측에 범례 배치
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()
이 방법은 그래프 영역의 일부를 편리하게 범례에 할당할 수 있도록 합니다. ax.get_position()
으로 현재 축의 위치를 가져와 범례를 재배치하기 전에 적절하게 조정한 점을 주목하세요.
그래프 하단에 범례 배치
그래프 오른쪽에 범례를 배치하는 것이 적절하지 않은 경우, 그래프 하단에 배치하는 옵션이 있습니다. 아래는 예시입니다:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in range(5):
line, = ax.plot(x, i * x, label='$y = %ix$'%i)
# 축 하단에 10% 크기 축소
box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1,
box.width, box.height * 0.9])
# 축 하단에 범례 배치
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
fancybox=True, shadow=True, ncol=5)
plt.show()
이 방법은 그래프의 시각화를 방해하지 않으면서 가능한 공간을 효과적으로 활용하는 데 도움이 됩니다.
범례의 범례: Matplotlib 범례 가이드
Matplotlib 플롯에서 범례 배치를 제어하는 방법을 알아야 하는 것은 입문자나 전문가 모두에게 필수적인 기술입니다. 이제 우리는 그래프 외부에 범례를 배치하는 여러 가지 방법을 다루었으니, 좀 더 고급스러운 사용자 정의에 대해 살펴보겠습니다.
범례 디자인 미학
가끔씩 범례를 더 읽기 쉽고 아름답게 만들고 싶을 때가 있습니다. fancybox
, shadow
, borderpad
매개변수는 다양한 스타일링 옵션을 허용합니다:
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
fancybox=True, shadow=True, borderpad=1)
위 코드는 사방에 경계선이 있는 fancybox
로 범례를 꾸미며, 그림자를 shadow
로 적용하고, borderpad
를 1로 설정하여 테두리와 범례 텍스트 사이의 여백을 늘리는 것을 보여줍니다.
이러한 스타일링 매개변수는 사용자가 만족할 때까지 조정할 수 있습니다. 높은 해상도로 출력할 때는 보통 배경의 대조를 높이기 위해 facecolor
매개변수를 활용합니다. 이런 식으로:
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
fancybox=True, shadow=True, borderpad=1,
facecolor='white')
이제 범례 배치와 디자인을 쉽게 커스터마이징할 수 있습니다!
이 예제에서 fancybox=True
는 범례 상자를 둥근 모서리로 만들고, shadow=True
는 그림자 효과를 추가하며, borderpad=1.5
는 상자 내부의 패딩을 더 많이 추가합니다.
범례 항목 순서 변경
경우에 따라 범례 항목의 순서를 변경하려는 경우가 있습니다. Matplotlib의 HandlerLine2D
클래스를 사용하여 이를 수행할 수 있습니다. 간단한 예시를 살펴보겠습니다.
from matplotlib.lines import Line2D
fig, ax = plt.subplots()
lines = []
labels = []
for i in range(5):
line, = ax.plot(x, i * x, label='$y = %ix$' % i)
lines.append(line)
labels.append('$y = %ix$' % i)
# 라벨 및 라인 핸들 재정렬
lines = [lines[i] for i in [4, 2, 0, 1, 3]]
labels = [labels[i] for i in [4, 2, 0, 1, 3]]
# 첫 번째 라인에 대한 범례 생성
first_legend = plt.legend(lines[:2], labels[:2], loc='upper left')
# 범례 수동으로 추가
ax.add_artist(first_legend)
# 남은 범례 항목에 대해 추가 범례 생성
plt.legend(lines[2:], labels[2:], loc='lower right')
plt.show()
이 시나리오에서 먼저 라인을 플롯하고, 핸들과 라벨을 저장한 다음 원하는 대로 재정렬합니다.
Matplotlib 대체 방법: PyGWalker를 사용하여 데이터 시각화하기
Pandas DataFrame을 시각화하려면 Matplotlib을 사용할 수 있습니다. 그러나 Open Source python 라이브러리인 PyGWalker (opens in a new tab)를 사용하여 이를 구현할 수도 있습니다.
이제 더 이상 복잡한 Python 코딩으로 처리를 완료할 필요가 없습니다. 데이터를 가져와서 변수를 끌어다 놓기만 하면 모든 종류의 데이터 시각화를 생성할 수 있습니다! 작업에 대한 빠른 데모 비디오입니다.
Jupyter Notebook에서 PyGWalker 사용 방법은 다음과 같습니다.
pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)
또한 Kaggle Notebook / Google Colab에서도 사용해 볼 수 있습니다.
카글 노트북에서 PyGWalker 실행하기 (Run PyGWalker in Kaggle Notebook) | 구글 콜랩에서 PyGWalker 실행하기 (Run PyGWalker in Google Colab) | PyGWalker를 GitHub에서 ⭐️로 평가하기 (Give PyGWalker a ⭐️ on GitHub) |
---|---|---|
(opens in a new tab) | (opens in a new tab) | (opens in a new tab) |
PyGWalker는 우리 오픈소스 커뮤니티의 지원을 받아 개발하였습니다. 깃허브 PyGWalker GitHub (opens in a new tab)에서 저희에게 ⭐️를 줘주세요!
결론
Matplotlib 레전드의 다양한 맞춤 설정 옵션을 이해하는 것은 전문적인 수준의 그래프 작성에 필수적입니다. 이러한 기술을 연습하고 데이터 시각화에 필수적인 이 도구를 마스터하기 위해 Matplotlib 문서를 탐색하세요.
자주 묻는 질문
다음은 Matplotlib에서 레전드 배치에 대한 자주 묻는 질문에 대한 답변입니다.
Q1: Matplotlib 레전드를 플롯 영역 밖에 배치하여 플롯 자체의 크기를 조정하지 않고 배치할 수 있나요?
네, 플롯 크기를 조정하지 않고 플롯 영역 밖에 레전드를 배치할 수 있습니다. 그러나 plt.savefig()
에서 bbox_inches ='tight'
옵션이 축 경계 밖의 요소들을 고려하지 못할 수 있으므로 저장된 그림에서 레전드가 보이지 않을 수 있습니다.
Q2: 레전드의 최상의 위치를 자동으로 결정할 수 있는 방법이 있나요?
네, Matplotlib은 legend()
함수에서 loc ='best'
를 전달하여 레전드의 최상의 위치를 자동으로 결정할 수 있습니다. 이 기능은 레전드가 플롯과 최소한의 중첩으로 배치되도록 합니다.
Q3: 레전드 라벨이 플롯과 겹쳐서 가독성이 떨어지면 어떻게 해야 하나요?
레전드 라벨의 가독성을 높이려면 반투명한 레전드 배경을 사용하여 해결할 수 있습니다. 이는 legend()
에서 framealpha
매개변수를 설정하여 구현할 수 있습니다. 예를 들어, ax.legend(framealpha=0.5)
는 반투명 레전드 배경을 설정합니다.