Matplotlib에서 기본 범례 기호 대신 원이나 타원 같은 사용자 정의 도형을 범례에 표시하고 싶다면, HandlerPatch 클래스를 상속하여 커스텀 핸들러를 만드는 방법을 사용할 수 있습니다. 아래 단계별로 살펴보겠습니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.
- HandlerPatch 클래스를 상속받아
create_artists()메서드를 오버라이드합니다. 이 메서드 안에서 타원 패치(Ellipse patch)를 생성하고, 속성을 업데이트한 뒤 해당 패치를 반환합니다. - Circle 클래스를 사용해 플롯 위에 원을 그립니다.
- 생성한 원 패치를 현재 축(current axis)에 추가합니다.
- legend() 메서드를 호출하면서
handler_map인자에 커스텀 핸들러를 지정하여 범례를 배치합니다. - show() 메서드로 최종 그림을 화면에 표시합니다.
예제 코드
import matplotlib.pyplot as plt, matplotlib.patches as mpatches
from matplotlib.legend_handler import HandlerPatch
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
class HandlerEllipse(HandlerPatch):
def create_artists(self, legend, orig_handle, xdescent, ydescent, width, height, fontsize, trans):
center = 0.5 * width - 0.5 * xdescent, 0.5 * height - 0.5 * ydescent
p = mpatches.Ellipse(xy=center, width=width + xdescent, height=height + ydescent)
self.update_prop(p, orig_handle, legend)
p.set_transform(trans)
return [p]
c = mpatches.Circle((0.5, 0.5), 0.25, facecolor="green", edgecolor="red", linewidth=1)
plt.gca().add_patch(c)
plt.legend([c], ["타원형 사용자 정의 범례 요소"],
handler_map={mpatches.Circle: HandlerEllipse()})
plt.show()코드 설명
HandlerEllipse 클래스는 HandlerPatch를 상속받아 범례에 표시될 아티스트(도형)를 직접 생성합니다. create_artists() 메서드 내부에서는 전달받은 너비와 높이를 기준으로 중심 좌표를 계산하고, 그 위치에 Ellipse 객체를 만듭니다. 이후 update_prop()으로 원래 핸들의 색상·선 스타일 등 속성을 복사하고, 변환 행렬(trans)을 적용한 뒤 패치 리스트를 반환합니다.
녹색 면과 빨간 테두리를 가진 Circle 패치를 생성하여 현재 축에 추가한 후, legend() 호출 시 handler_map에 {mpatches.Circle: HandlerEllipse()}를 전달함으로써, 원형 패치가 범례에서는 타원 모양으로 렌더링되도록 매핑합니다.
실행 결과
위 코드를 실행하면 플롯에는 녹색 바탕에 빨간 테두리를 가진 원이 나타나고, 범례에는 동일한 스타일의 타원 기호와 함께 "타원형 사용자 정의 범례 요소"라는 레이블이 표시됩니다.