파이썬(Python)/matplotlib

graph내에 event 처리 방법 - 마우스 클릭, 롤오버

끄적끄적아무거나 2020. 11. 20. 17:46
반응형

matplotbli으로 graph를 그리고 난 뒤 마우스 클릭이나 키보드 동작같은 event에 따라 다른 동작을 시킬 때(bind) 유용한 기능이다. 

 

아래 예제 코드를 통해 사용법을 알아 보자. 아래 코드 예제는 참조 링크에서 가져왔다. 

 

from matplotlib import pyplot as plt

class LineBuilder:
    def __init__(self, line):
        self.line = line
        self.xs = list(line.get_xdata())
        self.ys = list(line.get_ydata())
        self.cid = line.figure.canvas.mpl_connect('button_press_event', self)

    def __call__(self, event):
        print('click', event)
        if event.inaxes!=self.line.axes: return
        self.xs.append(event.xdata)
        self.ys.append(event.ydata)
        self.line.set_data(self.xs, self.ys)
        self.line.figure.canvas.draw()

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click to build line segments')
line, = ax.plot([0], [0])  # empty line
linebuilder = LineBuilder(line)

plt.show()

결과 >> fig에서 마우스를 클릭할때마다 라인이 연결되서 생김

click button_press_event: xy=(174, 243) xydata=(-0.03415322580645162, 0.0016071428571428625) button=1 dblclick=False inaxes=AxesSubplot(0.125,0.11;0.775x0.77)
click button_press_event: xy=(250, 310) xydata=(-0.017298387096774198, 0.02154761904761905) button=1 dblclick=False inaxes=AxesSubplot(0.125,0.11;0.775x0.77)
click button_press_event: xy=(388, 312) xydata=(0.013306451612903225, 0.02214285714285716) button=1 dblclick=False inaxes=AxesSubplot(0.125,0.11;0.775x0.77)
click button_press_event: xy=(409, 188) xydata=(0.01796370967741935, -0.01476190476190476) button=1 dblclick=False inaxes=AxesSubplot(0.125,0.11;0.775x0.77)

 

해석>>

 

fig = plt.figure()

ax = fig.add_subplot(111)

우선 그림그릴 fig와 axes를 위처럼 선언했다. 

line, = ax.plot([0], [0])

x,y 축의 값을 0,0 중앙에 배치하고 line 에 객체 값을 넣었다. line, 을 한 것은 리스트 값을 빼온다는 뜻임. 즉,

line = ax.plot([0], [0])[0]와 같은 의미 임

 

self.xs = list(line.get_xdata())

self.ys = list(line.get_ydata())

line에서 x,y 값을 받아서 리스트로 넣어둠

 

 

self.cid = line.figure.canvas.mpl_connect('button_press_event'self)

마우스 버튼을 누를 경우 self 즉 LineBuilder 클래스를 호출하겠다는 의미이다.

 

def __call__(selfevent):

LineBuilder 이 호출될때 event 값과 같이 받아서 __call__이 동작한다. 

 

self.xs.append(event.xdata)

self.ys.append(event.ydata)

self.line.set_data(self.xs, self.ys)

self.line.figure.canvas.draw()

event 에서 x,y 값을 받아서 set_data 로 line에 추가 하고 그리면 된다.

 

/////////////////////////////////////////////////////////////////////////////////////

button_press_event 말고 아래 목차처럼 다양한 event가 존재한다. 테스트를 위해 event 변경해서 위 예제를 진행해보면 될 듯하다. 

 

 

 

참조>>

matplotlib.org/users/event_handling.html

반응형