Matplotlib 를 사용한 데이터 리샘플링

Beginner

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

소개

이 랩에서는 Python 의 Matplotlib 을 사용하여 데이터를 다운샘플링하는 방법을 배웁니다. 다운샘플링은 신호의 샘플 속도 또는 샘플 크기를 줄이는 과정입니다. 우리는 데이터를 다운샘플링하고 확대/축소 시 다시 계산하는 클래스를 사용할 것입니다.

VM 팁

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

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

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

라이브러리 임포트

먼저 필요한 라이브러리를 임포트하는 것으로 시작합니다. 이 작업에는 Matplotlib 및 NumPy 라이브러리를 사용할 것입니다.

import matplotlib.pyplot as plt
import numpy as np

클래스 정의

데이터를 다운샘플링하고 확대/축소 시 다시 계산하는 DataDisplayDownsampler 클래스를 정의합니다. 클래스의 생성자는 xdata 와 ydata 를 입력 매개변수로 사용합니다. 최대 점 수를 50 으로 설정하고 xdata 의 델타를 계산합니다.

class DataDisplayDownsampler:
    def __init__(self, xdata, ydata):
        self.origYData = ydata
        self.origXData = xdata
        self.max_points = 50
        self.delta = xdata[-1] - xdata[0]

데이터 다운샘플링

데이터를 다운샘플링하는 downsample 메서드를 정의합니다. 이 메서드는 xstart 와 xend 를 입력 매개변수로 사용합니다. 뷰 범위 내의 점들을 가져오고, 선이 잘리지 않도록 뷰 범위 바로 바깥의 점들을 잡기 위해 마스크를 1 만큼 팽창시킵니다. 삭제할 점의 수를 정렬하고 데이터를 마스크 처리합니다. 마지막으로, 데이터를 다운샘플링하고 xdata 와 ydata 를 반환합니다.

def downsample(self, xstart, xend):
    ## get the points in the view range
    mask = (self.origXData > xstart) & (self.origXData < xend)
    ## dilate the mask by one to catch the points just outside
    ## of the view range to not truncate the line
    mask = np.convolve([1, 1, 1], mask, mode='same').astype(bool)
    ## sort out how many points to drop
    ratio = max(np.sum(mask) // self.max_points, 1)

    ## mask data
    xdata = self.origXData[mask]
    ydata = self.origYData[mask]

    ## downsample data
    xdata = xdata[::ratio]
    ydata = ydata[::ratio]

    print(f"using {len(ydata)} of {np.sum(mask)} visible points")

    return xdata, ydata

데이터 업데이트

데이터를 업데이트하는 update 메서드를 정의합니다. 이 메서드는 ax (축) 를 입력 매개변수로 사용합니다. 뷰 제한을 가져와서 선을 업데이트하고, 뷰 제한의 너비가 delta 와 다른지 확인합니다. 뷰 제한의 너비가 delta 와 다르면 delta 를 업데이트하고 xstart 와 xend 를 가져옵니다. 그런 다음 데이터를 다운샘플링된 데이터로 설정하고 유휴 상태로 그립니다.

def update(self, ax):
    ## Update the line
    lims = ax.viewLim
    if abs(lims.width - self.delta) > 1e-8:
        self.delta = lims.width
        xstart, xend = lims.intervalx
        self.line.set_data(*self.downsample(xstart, xend))
        ax.figure.canvas.draw_idle()

신호 생성

NumPy 를 사용하여 신호를 생성합니다. linspace 함수를 사용하여 xdata 배열을 생성하며, start=16, stop=365, num=(365-16)*4 로 설정합니다. sin 및 cos 함수를 사용하여 ydata 배열을 생성합니다.

xdata = np.linspace(16, 365, (365-16)*4)
ydata = np.sin(2*np.pi*xdata/153) + np.cos(2*np.pi*xdata/127)

플롯 생성

Matplotlib 를 사용하여 플롯을 생성합니다. xdata 와 ydata 를 사용하여 DataDisplayDownsampler 클래스의 인스턴스 d를 생성합니다. subplots 함수를 사용하여 figure 와 axis 를 생성합니다. 선을 연결하고 autoscale 을 False 로 설정합니다. 뷰 제한 변경에 연결하고, x 제한을 설정한 다음 플롯을 표시합니다.

d = DataDisplayDownsampler(xdata, ydata)
fig, ax = plt.subplots()
d.line, = ax.plot(xdata, ydata, 'o-')
ax.set_autoscale_on(False)
ax.callbacks.connect('xlim_changed', d.update)
ax.set_xlim(16, 365)
plt.show()

요약

이 랩에서는 Python 에서 Matplotlib 를 사용하여 데이터를 다운샘플링하는 방법을 배웠습니다. 데이터를 다운샘플링하고 확대/축소 시 재계산하는 클래스를 사용했습니다. NumPy 를 사용하여 신호를 생성하고 Matplotlib 를 사용하여 플롯을 생성했습니다. 뷰 제한 변경에 연결하고 x 제한을 설정했습니다.