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