Matplotlib 를 이용한 돋보기 효과 만들기

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Matplotlib 에서 마우스 이벤트를 사용하여 룩킹 글래스 (looking glass) 효과를 만드는 과정을 안내합니다. 이 예제는 클릭하고 드래그하여 이동할 수 있는 원형 영역 내에서 데이터를 검사할 수 있도록 합니다.

VM 팁

VM 시작이 완료되면, 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 접속하십시오.

때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한 사항으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.

학습 중 문제가 발생하면 언제든지 Labby 에게 문의하십시오. 세션 후 피드백을 제공해주시면 문제를 신속하게 해결해 드리겠습니다.

필요한 라이브러리 가져오기

Matplotlib 라이브러리, NumPy 라이브러리 및 Matplotlib 패치 모듈을 가져와야 합니다. 이러한 라이브러리를 사용하여 룩킹 글래스 (looking glass) 효과를 만들 것입니다.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as patches

랜덤 데이터 생성

NumPy 를 사용하여 두 세트의 랜덤 데이터를 생성합니다. 이 데이터는 산점도를 만들기 위해 플롯됩니다.

## Fixing random state for reproducibility
np.random.seed(19680801)

x, y = np.random.rand(2, 200)

Figure 및 Axes 생성

subplots() 함수를 사용하여 figure 와 axes 객체를 생성합니다. 또한 patches.Circle() 함수를 사용하여 axes 객체에 노란색 원 패치를 추가합니다.

fig, ax = plt.subplots()
circ = patches.Circle((0.5, 0.5), 0.25, alpha=0.8, fc='yellow')
ax.add_patch(circ)

데이터 플롯팅

2 단계에서 생성된 랜덤 데이터를 plot() 함수를 사용하여 두 번 플롯합니다. 첫 번째 플롯은 alpha 값이 0.2 이고, 두 번째 플롯은 alpha 값이 1.0 이며, 클립 경로 (clip path) 가 노란색 원 패치로 설정됩니다.

ax.plot(x, y, alpha=0.2)
line, = ax.plot(x, y, alpha=1.0, clip_path=circ)
ax.set_title("Left click and drag to move looking glass")

이벤트 핸들러 생성

플롯 주위에서 노란색 원 패치를 이동하는 데 필요한 마우스 이벤트를 처리할 이벤트 핸들러 클래스를 생성합니다. 이 클래스는 on_press(), on_release(), 그리고 on_move() 세 가지 메서드를 포함합니다.

class EventHandler:
    def __init__(self):
        fig.canvas.mpl_connect('button_press_event', self.on_press)
        fig.canvas.mpl_connect('button_release_event', self.on_release)
        fig.canvas.mpl_connect('motion_notify_event', self.on_move)
        self.x0, self.y0 = circ.center
        self.pressevent = None

    def on_press(self, event):
        if event.inaxes != ax:
            return

        if not circ.contains(event)[0]:
            return

        self.pressevent = event

    def on_release(self, event):
        self.pressevent = None
        self.x0, self.y0 = circ.center

    def on_move(self, event):
        if self.pressevent is None or event.inaxes != self.pressevent.inaxes:
            return

        dx = event.xdata - self.pressevent.xdata
        dy = event.ydata - self.pressevent.ydata
        circ.center = self.x0 + dx, self.y0 + dy
        line.set_clip_path(circ)
        fig.canvas.draw()

handler = EventHandler()
plt.show()

프로그램 실행

프로그램을 실행하고 노란색 원 패치를 왼쪽 클릭하여 드래그하여 플롯 주위로 이동합니다. 이 효과를 사용하여 원형 영역 내의 데이터를 검사할 수 있습니다.

요약

이 랩에서는 Matplotlib 에서 마우스 이벤트를 사용하여 돋보기 효과를 만드는 방법을 배웠습니다. 우리는 임의의 데이터를 생성하고, 데이터를 플롯하고, 마우스 이벤트를 처리하기 위한 이벤트 핸들러 클래스를 만들었습니다. 노란색 원 패치를 왼쪽 클릭하고 드래그하여 플롯 주위로 이동하고 원형 영역 내의 데이터를 검사할 수 있었습니다.