Datenumstellung mit Matplotlib

PythonPythonBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir lernen, wie man Daten in Python mit Matplotlib aufniederschlüsselt. Downsampling ist der Prozess, um die Abtastrate oder die Stichprobengröße eines Signals zu reduzieren. Wir werden eine Klasse verwenden, die die Daten aufniederschlüsselt und beim Zoomen neu berechnet.

Tipps für die VM

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Bibliotheken importieren

Wir werden beginnen, indem wir die erforderlichen Bibliotheken importieren. Für diese Aufgabe werden wir die Matplotlib- und NumPy-Bibliotheken verwenden.

import matplotlib.pyplot as plt
import numpy as np

Die Klasse definieren

Wir werden eine Klasse DataDisplayDownsampler definieren, die die Daten aufniederschlüsselt und beim Zoomen neu berechnet. Der Konstruktor der Klasse wird die xdata und ydata als Eingabeparameter entgegennehmen. Wir werden die maximale Anzahl von Punkten auf 50 setzen und die Differenz von xdata berechnen.

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

Daten aufniederschlüsseln

Wir werden eine Methode downsample definieren, die die Daten aufniederschlüsselt. Die Methode wird die xstart und xend als Eingabeparameter entgegennehmen. Wir werden die Punkte im Anzeigebereich erhalten und die Maske um eins erweitern, um die Punkte direkt außerhalb des Anzeigebereichs zu erfassen, um die Linie nicht abzuschneiden. Wir werden herausfinden, wie viele Punkte weggelassen werden sollen, und die Daten maskieren. Schließlich werden wir die Daten aufniederschlüsseln und die xdata und ydata zurückgeben.

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

Aktualisierung der Daten

Wir werden eine Methode update definieren, die die Daten aktualisiert. Die Methode wird die ax (Achse) als Eingabeparameter entgegennehmen. Wir werden die Linie aktualisieren, indem wir die Anzeigegrenze erhalten und überprüfen, ob die Breite der Anzeigegrenze von delta unterschiedlich ist. Wenn die Breite der Anzeigegrenze von delta unterschiedlich ist, werden wir delta aktualisieren und xstart und xend erhalten. Wir werden dann die Daten auf die aufniedergeschlüsselten Daten setzen und das Leerlaufzeichen zeichnen.

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

Erstellen des Signals

Wir werden ein Signal mit NumPy erstellen. Wir werden ein Array xdata mit der linspace-Funktion erstellen, wobei start=16, stop=365 und num=(365-16)*4. Wir werden ein Array ydata mit den sin- und cos-Funktionen erstellen.

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

Erstellen des Plots

Wir werden einen Plot mit Matplotlib erstellen. Wir werden eine Instanz d der Klasse DataDisplayDownsampler mit xdata und ydata erstellen. Wir werden eine Figur und eine Achse mit der subplots-Funktion erstellen. Wir werden die Linie verbinden und die Autoskalierung auf False setzen. Wir werden für das Ändern der Anzeigegrenzen verbinden, die x-Begrenzung einstellen und den Plot anzeigen.

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

Zusammenfassung

In diesem Lab haben wir gelernt, wie man Daten in Python mit Matplotlib aufniederschlüsselt. Wir haben eine Klasse verwendet, die die Daten aufniederschlüsselt und beim Vergrößern neu berechnet. Wir haben ein Signal mit NumPy erstellt und einen Plot mit Matplotlib erstellt. Wir haben uns für das Ändern der Anzeigegrenzen verbunden und die x-Begrenzung gesetzt.