Matplotlib로 그린 그래프 위에 마우스를 움직이면 해당 위치의 좌표값을 실시간으로 보여주는 커서(Cursor) 기능을 추가할 수 있습니다. 이 기능은 데이터 분석이나 시각화 결과를 탐색할 때 매우 유용합니다.
구현 단계
- 그림 크기를 설정하고 서브플롯 주변의 여백을 조정합니다.
- NumPy를 사용하여 t와 s 데이터 포인트를 생성합니다.
- Figure와 서브플롯을 생성합니다.
- 커서 클래스 인스턴스를 만들어 플롯 위의 커서 위치를 갱신할 수 있도록 준비합니다.
mouse_event함수에서 마우스 현재 위치의 x, y 데이터를 가져옵니다.- x, y 데이터 포인트의 인덱스를 계산합니다.
- 세로선과 마커의 x, y 위치를 설정합니다.
- 텍스트 위치를 지정하고 캔버스를 다시 그려 화면을 갱신합니다.
plot()메서드로 t, s 데이터를 그립니다.- 축 속성을 설정합니다.
show()메서드로 그림을 화면에 표시합니다.
예제 코드
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
class CursorClass(object):
def __init__(self, ax, x, y):
self.ax = ax
self.ly = ax.axvline(color='yellow', alpha=0.5)
self.marker, = ax.plot([0], [0], marker="o", color="red", zorder=3)
self.x = x
self.y = y
self.txt = ax.text(0.7, 0.9, '')
def mouse_event(self, event):
if event.inaxes:
x, y = event.xdata, event.ydata
indx = np.searchsorted(self.x, [x])[0]
x = self.x[indx]
y = self.y[indx]
self.ly.set_xdata(x)
self.marker.set_data([x], [y])
self.txt.set_text('x=%1.2f, y=%1.2f' % (x, y))
self.txt.set_position((x, y))
self.ax.figure.canvas.draw_idle()
else:
return
t = np.arange(0.0, 1.0, 0.01)
s = np.sin(2 * 2 * np.pi * t)
fig, ax = plt.subplots()
cursor = CursorClass(ax, t, s)
cid = plt.connect('motion_notify_event', cursor.mouse_event)
ax.plot(t, s, lw=2, color='green')
plt.axis([0, 1, -1, 1])
plt.show()코드 설명
CursorClass는 세 가지 시각 요소를 담당합니다. 노란색 반투명 수직선(axvline)은 마우스 x 위치를 추적하고, 빨간색 마커(marker)는 곡선 위의 정확한 데이터 지점을 표시하며, 텍스트 레이블은 해당 지점의 좌표값을 소수점 두 자리까지 출력합니다.
np.searchsorted를 사용하면 마우스 위치와 가장 가까운 데이터 배열의 인덱스를 효율적으로 찾을 수 있어, 커서가 항상 실제 데이터 포인트에 스냅(snap)됩니다.
motion_notify_event 이벤트를 plt.connect()로 연결하면 마우스가 축 영역 안에서 움직일 때마다 mouse_event가 호출되어 커서가 실시간으로 갱신됩니다. 마우스가 축 밖으로 나가면 아무 동작도 하지 않고 종료됩니다.
실행 결과
코드를 실행하고 그래프 위에서 마우스를 움직이면, 노란색 수직선과 빨간색 마커가 사인 곡선을 따라 이동하면서 현재 좌표(x, y 값)가 함께 표시되는 것을 확인할 수 있습니다.