Matplotlib Zeitreihen-Histogramm

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 wird gezeigt, wie man große Mengen von Zeitreihen effizient visualisieren kann, um möglicherweise verborgene Unterstrukturen und Muster zu entdecken, die nicht unmittelbar offensichtlich sind, und sie auf visuell ansprechende Weise darstellen.

Tipps für die virtuelle Maschine

Nachdem der Start der virtuellen Maschine 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.

Importieren der erforderlichen Bibliotheken

In diesem Schritt importieren wir die erforderlichen Bibliotheken für dieses Lab.

import time
import matplotlib.pyplot as plt
import numpy as np

Daten generieren

In diesem Schritt werden wir mehrere sinusförmige "Signal"-Reihen generieren, die unter einer größeren Anzahl von Zufallswalk-"Rauschen/Hintergrund"-Reihen verborgen sind. Wir werden unvoreingenommene Gaußsche Zufallswalks und sinusförmige Signale generieren.

## Fix random state for reproducibility
np.random.seed(19680801)

## Make some data; a 1D random walk + small fraction of sine waves
num_series = 1000
num_points = 100
SNR = 0.10  ## Signal to Noise Ratio
x = np.linspace(0, 4 * np.pi, num_points)

## Generate unbiased Gaussian random walks
Y = np.cumsum(np.random.randn(num_series, num_points), axis=-1)

## Generate sinusoidal signals
num_signal = round(SNR * num_series)
phi = (np.pi / 8) * np.random.randn(num_signal, 1)  ## small random offset
Y[-num_signal:] = (
    np.sqrt(np.arange(num_points))  ## random walk RMS scaling factor
    * (np.sin(x - phi)
       + 0.05 * np.random.randn(num_signal, num_points))  ## small random noise
)

Daten mit Liniendiagramm visualisieren

In diesem Schritt werden wir die generierten Daten mit einem Liniendiagramm visualisieren.

## Plot series using `plot` and a small value of `alpha`.
## With this view, it is very difficult to observe the sinusoidal behavior because of how many overlapping series there are.
## It also takes a bit of time to run because so many individual artists need to be generated.
tic = time.time()
plt.plot(x, Y.T, color="C0", alpha=0.1)
toc = time.time()
plt.title("Line plot with alpha")
plt.show()
print(f"{toc-tic:.3f} sec. elapsed")

Daten mit 2D-Histogramm - Log-Farbskala visualisieren

In diesem Schritt werden wir die mehreren Zeitreihen in ein Histogramm umwandeln. Nicht nur wird das versteckte Signal sichtbarer, sondern es ist auch ein viel schnellerer Vorgang. Wir werden (x, y)-Punkte in einem 2D-Histogramm mit einer Log-Farbskala plotten.

tic = time.time()

## Linearly interpolate between the points in each time series
num_fine = 800
x_fine = np.linspace(x.min(), x.max(), num_fine)
y_fine = np.concatenate([np.interp(x_fine, x, y_row) for y_row in Y])
x_fine = np.broadcast_to(x_fine, (num_series, num_fine)).ravel()

## Plot (x, y) points in 2d histogram with log colorscale
## It is pretty evident that there is some kind of structure under the noise
## You can tune vmax to make signal more visible
cmap = plt.colormaps["plasma"]
cmap = cmap.with_extremes(bad=cmap(0))
h, xedges, yedges = np.histogram2d(x_fine, y_fine, bins=[400, 100])
pcm = plt.pcolormesh(xedges, yedges, h.T, cmap=cmap,
                         norm="log", vmax=1.5e2, rasterized=True)
plt.colorbar(pcm, label="## points", pad=0)
plt.title("2D Histogram and Log Color Scale")
plt.show()

toc = time.time()
print(f"{toc-tic:.3f} sec. elapsed")

Daten mit 2D-Histogramm - Lineare Farbskala visualisieren

In diesem Schritt werden wir die Daten mit einer linearen Farbskala visualisieren.

## Same data but on linear color scale
pcm = plt.pcolormesh(xedges, yedges, h.T, cmap=cmap,
                         vmax=1.5e2, rasterized=True)
plt.colorbar(pcm, label="## points", pad=0)
plt.title("2D Histogram and Linear Color Scale")
plt.show()

Zusammenfassung

In diesem Lab haben wir gelernt, wie man große Mengen von Zeitreihen effizient so visualisieren kann, dass potentielle versteckte Unterstrukturen und Muster, die nicht sofort offensichtlich sind, aufgedeckt und auf visuell ansprechende Weise dargestellt werden können. Wir haben mehrere sinusförmige "Signal"-Reihen generiert, die unter einer größeren Anzahl von Zufallswalk-"Rauschen/Hintergrund"-Reihen verborgen sind, und wir haben die Daten mit einem Liniendiagramm und einem 2D-Histogramm mit Log- und linearen Farbskalen visualisiert.