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

Matplotlib 곡선에 마우스 커서 추가하는 방법 완벽 가이드

Matplotlib로 그린 그래프 위에 마우스를 움직이면 해당 위치의 좌표값을 실시간으로 보여주는 커서(Cursor) 기능을 추가할 수 있습니다. 이 기능은 데이터 분석이나 시각화 결과를 탐색할 때 매우 유용합니다.

구현 단계

  • 그림 크기를 설정하고 서브플롯 주변의 여백을 조정합니다.
  • NumPy를 사용하여 ts 데이터 포인트를 생성합니다.
  • 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 값)가 함께 표시되는 것을 확인할 수 있습니다.