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

matplotlib에서 fig.canvas.mpl_connect('key_press_event')의 on_key 콜백 함수에 매개변수 전달하는 방법

matplotlib에서 fig.canvas.mpl_connect('key_press_event', on_key)로 키 입력 이벤트를 처리할 때, 콜백 함수인 on_key에 추가 매개변수를 전달해야 하는 경우가 종종 있습니다. mpl_connect는 기본적으로 event 객체 하나만 콜백에 전달하도록 설계되어 있기 때문에, 람다(lambda) 함수나 functools.partial을 활용하면 원하는 인자를 함께 넘길 수 있습니다.

기본 구현 단계

  • 그림(figure) 크기를 설정하고 서브플롯 주변의 여백을 조정합니다.
  • figure와 subplot 집합을 생성합니다.
  • 축의 x, y 범위를 설정합니다.
  • 키 입력 이벤트에 콜백 함수를 바인딩합니다.
  • show() 메서드로 그림을 화면에 표시합니다.

예제 코드

import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

fig, ax = plt.subplots()
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)

def onkey(event):
    if event.key.isalpha():
        if event.xdata is not None and event.ydata is not None:
            ax.plot(event.xdata, event.ydata, 'bo-')
            fig.canvas.draw()

cid2 = fig.canvas.mpl_connect('key_press_event', onkey)
plt.show()

이 기본 예제에서는 알파벳 키를 누를 때마다 마우스 커서 위치에 파란색 점이 찍힙니다. 하지만 위 코드처럼 함수 이름만 전달하면 별도의 매개변수를 넘길 수 없습니다. 아래 두 가지 방법으로 이 문제를 해결할 수 있습니다.

방법 1: 람다(lambda) 함수 활용

cid = fig.canvas.mpl_connect(
    'key_press_event',
    lambda event: onkey(event, color='ro-', label='my_data')
)

방법 2: functools.partial 활용

from functools import partial

def onkey(event, color, label):
    if event.key.isalpha():
        if event.xdata is not None and event.ydata is not None:
            ax.plot(event.xdata, event.ydata, color)
            fig.canvas.draw()
            print(f'{label}: ({event.xdata:.2f}, {event.ydata:.2f})')

cid = fig.canvas.mpl_connect(
    'key_press_event',
    partial(onkey, color='bo-', label='my_data')
)

두 방식 모두 콜백이 event 객체를 첫 번째 인자로 받고, 나머지 매개변수는 미리 지정한 값으로 전달됩니다. 이를 활용하면 키를 누를 때마다 마커 색상·스타일이나 출력 형식 등을 자유롭게 제어할 수 있으며, 여러 개의 이벤트 핸들러에 서로 다른 설정을 적용하는 것도 가능합니다.