Ресемплирование данных с использованием Matplotlib

Beginner

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

Введение

В этом практическом занятии мы научимся уменьшать частоту дискретизации данных с использованием Matplotlib в Python. Уменьшение частоты дискретизации - это процесс уменьшения частоты дискретизации или размера выборки сигнала. Мы будем использовать класс, который уменьшает частоту дискретизации данных и пересчитывает их при приближении.

Советы по использованию ВМ

После запуска виртуальной машины нажмите в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к 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 в качестве входных параметров. Мы получим точки в диапазоне просмотра и расширим маску на единицу, чтобы захватить точки, расположенные непосредственно за пределами диапазона просмотра, чтобы не обрезать линию. Затем мы определим, сколько точек нужно удалить, и применим маску к данным. Наконец, мы уменьшим частоту дискретизации данных и вернем 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. Создадим массив xdata с помощью функции linspace с начальным значением start=16, конечным значением stop=365 и количеством точек num=(365-16)*4. Затем создадим массив ydata с использованием функций sin и cos.

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

Создание графика

Мы создадим график с использованием Matplotlib. Создадим экземпляр d класса DataDisplayDownsampler с использованием xdata и ydata. Создадим фигуру и ось с использованием функции subplots. Свяжем линию и выключим автоматическую шкалирование. Подключимся для изменения пределов просмотра, установим пределы по оси 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()

Резюме

В этом практическом занятии мы узнали, как уменьшать частоту дискретизации данных с использованием Matplotlib в Python. Мы использовали класс, который уменьшает частоту дискретизации данных и пересчитывает их при приближении. Мы создали сигнал с использованием NumPy и график с использованием Matplotlib. Мы подключились для изменения пределов просмотра и установили пределы по оси x.