简介
本实验展示了如何以一种高效的方式可视化大量时间序列数据,这种方式有可能揭示那些并非一目了然的隐藏子结构和模式,并以视觉上吸引人的方式展示它们。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会立即为你解决问题。
导入所需库
在这一步中,我们将导入本实验所需的库。
import time
import matplotlib.pyplot as plt
import numpy as np
生成数据
在这一步中,我们将生成多个正弦“信号”序列,这些序列隐藏在大量随机游走“噪声/背景”序列之下。我们将生成无偏高斯随机游走和正弦信号。
## 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
)
使用折线图可视化数据
在这一步中,我们将使用折线图来可视化生成的数据。
## 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")
使用二维直方图 - 对数颜色刻度可视化数据
在这一步中,我们将把多个时间序列转换为直方图。这样不仅隐藏的信号会更明显,而且这也是一个快得多的过程。我们将在具有对数颜色刻度的二维直方图中绘制 (x, y) 点。
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")
使用二维直方图 - 线性颜色刻度可视化数据
在这一步中,我们将使用线性颜色刻度来可视化数据。
## 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()
总结
在这个实验中,我们学习了如何以一种能够潜在地揭示不那么明显的隐藏子结构和模式的方式,高效地可视化大量时间序列,并以视觉上吸引人的方式展示它们。我们生成了多个隐藏在大量随机游走“噪声/背景”序列之下的正弦“信号”序列,并用折线图以及具有对数和线性颜色刻度的二维直方图对数据进行了可视化。