Rééchantillonnage des données à l'aide de Matplotlib

Beginner

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

Introduction

Dans ce laboratoire, nous allons apprendre à réduire l'échantillonnage des données à l'aide de Matplotlib en Python. Le rééchantillonnage est le processus consistant à réduire la fréquence d'échantillonnage ou la taille d'échantillonnage d'un signal. Nous utiliserons une classe qui réduira l'échantillonnage des données et recomputera lorsque le zoom est effectué.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.

Importation des bibliothèques

Nous allons commencer par importer les bibliothèques nécessaires. Nous utiliserons les bibliothèques Matplotlib et NumPy pour cette tâche.

import matplotlib.pyplot as plt
import numpy as np

Définition de la classe

Nous allons définir une classe DataDisplayDownsampler qui réduira l'échantillonnage des données et recomputera lorsque le zoom est effectué. Le constructeur de la classe prendra les données x et y comme paramètres d'entrée. Nous définirons le nombre maximum de points à 50 et calculerons le delta des données x.

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

Rééchantillonnage des données

Nous allons définir une méthode downsample qui réduira l'échantillonnage des données. La méthode prendra xstart et xend comme paramètres d'entrée. Nous obtiendrons les points dans la plage d'affichage et dilaterons le masque de un pour capturer les points juste en dehors de la plage d'affichage afin de ne pas tronquer la ligne. Nous déterminerons combien de points doivent être éliminés et nous masquerons les données. Enfin, nous réduirons l'échantillonnage des données et renverrons les données x et y.

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

Mise à jour des données

Nous allons définir une méthode update qui mettra à jour les données. La méthode prendra ax (axe) comme paramètre d'entrée. Nous mettrons à jour la ligne en obtenant la limite d'affichage et en vérifiant si la largeur de la limite d'affichage est différente de delta. Si la largeur de la limite d'affichage est différente de delta, nous mettrons à jour delta et obtiendrons xstart et xend. Nous définirons ensuite les données sur les données rééchantillonnées et dessinerons l'état inactif.

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()

Création du signal

Nous allons créer un signal à l'aide de NumPy. Nous allons créer un tableau xdata à l'aide de la fonction linspace avec start = 16, stop = 365 et num=(365 - 16)*4. Nous allons créer un tableau ydata à l'aide des fonctions sin et cos.

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

Création du tracé

Nous allons créer un tracé à l'aide de Matplotlib. Nous allons créer une instance d de la classe DataDisplayDownsampler en utilisant xdata et ydata. Nous allons créer une figure et un axe à l'aide de la fonction subplots. Nous allons connecter la ligne et définir l'auto-échelle sur False. Nous allons connecter pour changer les limites d'affichage, définir la limite x et afficher le tracé.

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()

Sommaire

Dans ce laboratoire, nous avons appris à réduire l'échantillonnage des données à l'aide de Matplotlib en Python. Nous avons utilisé une classe qui réduit l'échantillonnage des données et le recalcul lorsqu'on zoom. Nous avons créé un signal à l'aide de NumPy et un tracé à l'aide de Matplotlib. Nous avons connecté pour changer les limites d'affichage et défini la limite x.