본문 바로가기
Developer/Python

[Python] Matplotlib 이벤트 핸들링 (마우스 이벤트, 키보드 이벤트)

by Doony 2020. 7. 30.

보통 우리가 사용하는 matplotlib와 같은 그래프 라이브러리들의 예제를 보면, 어레어로 입력값을 주고 단순히 띄우는 형태인데요. 가끔 파이썬을 사용하다보면, 그래프를 직접 그릴 일이 있습니다. 이번 포스팅에서는 matplotlib를 활용해서 interactive graph, 즉 그래프를 마우스 클릭질을 통해 직접 그려보는 예제를 다뤄보도록 하겠습니다. 공식 matplotlib 설명 페이지도 잘 되어 있으니 참고하시면 됩니다.


Matplotlib

파이썬을 하는 사람이라면 알 수 밖에 없는 아주 유명한 라이브러리입니다. 기본적으로 그래프와 관련된 대부분의 기능을 지원합니다. 간단한 사용법은 인터넷에 너~무 많아서 생략하겠습니다.


Interactive Graph 그리는 예제

사용자가 직접 설정한 범위 내에서, 그래프에 마우스로 점을 찍어 그래프를 그려주는 예제입니다. matplotlib에서는 event handler을 제공하기 때문에 마우스 버튼 또는 키보드 이벤트 핸들링을 할 수 있습니다. 위에서 첨부한 공식 사이트에 가면 상세 내용을 확인할 수 있습니다.


전체 코드는 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
 
fig, ax = plt.subplots(figsize=(158))
plt.grid(True)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Interactive Plot')
 
ax.set(xlim=[050], ylim=[050])
ax.set_aspect('auto', adjustable='box')
 
xdata = [0]
ydata = [0]
line, = ax.plot(xdata, ydata)
 
 
def add_point(event):
    if event.inaxes != ax:
        return
 
    # button 1: 마우스 좌클릭
    if event.button == 1:
       
 
        x = event.xdata
        y = event.ydata
 
        xdata.append(x)
        ydata.append(y)
 
        line.set_data(xdata, ydata)
        plt.draw()
            
 
    # button 3: 마우스 우클릭 시 기존 입력값 삭제
    if event.button == 3:
        xdata.pop()
        ydata.pop()
        line.set_data(xdata, ydata)
        plt.draw()
 
 
    # 마우스 중간버튼 클릭 시 종료하기
    if event.button == 2:
        plt.disconnect(cid)
        plt.close()
 
 
cid = plt.connect('button_press_event', add_point)
plt.show()
cs

코드는 크게 어렵지 않습니다. 마우스 클릭 버튼에 따라...


  • 좌클릭: x, y List에 점 좌표를 추가
  • 우클릭: pop을 통해 가장 최근의 점좌표를 제거
  • 중앙버튼 클릭: 그래프 그리기 종료

Jupyter notebook에서 실행할 경우

아마 위 코드를 실행해도 interactive하지 않을 겁니다. 다음 코드 추가하시면 쥬피터 상에서도 그래프 그리는 이벤트 핸들링이 가능합니다.


%matplotlib notebook

댓글