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.