Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Matplotlib 플롯에 사용자 정의 범례 기호를 추가하는 방법

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()}를 전달함으로써, 원형 패치가 범례에서는 타원 모양으로 렌더링되도록 매핑합니다.

실행 결과

위 코드를 실행하면 플롯에는 녹색 바탕에 빨간 테두리를 가진 원이 나타나고, 범례에는 동일한 스타일의 타원 기호와 함께 "타원형 사용자 정의 범례 요소"라는 레이블이 표시됩니다.