Введение
В этом практическом занятии мы научимся уменьшать частоту дискретизации данных с использованием 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.