如何在Python绘图中用色标高亮滑动窗口(时间序列场景)
实现滑动窗口的色标高亮可视化(单条时间序列)
我来帮你搞定这个滑动窗口高亮的需求,用Python的matplotlib库就能轻松实现。核心思路是先绘制原始时间序列,再为每个滑动窗口对应的时间区间添加半透明的填充色块,用渐变颜色区分不同窗口。
完整代码示例
import numpy as np import itertools as it import matplotlib.pyplot as plt import matplotlib.colors as mcolors # 你提供的滑动窗口生成函数 def moving_window(s, length, step=1): streams = it.tee(s, length) return zip(*[it.islice(stream, i, None, step*length) for stream, i in zip(streams, it.count(step=step))]) # 生成带极端事件的模拟时间序列(你可以替换成自己的真实数据) np.random.seed(42) # 固定随机种子保证可复现 s = np.random.randn(195) # 手动添加极端事件:20-30区间为高值,80-90区间为低值 s[20:30] += 5 s[80:90] -= 5 # 生成滑动窗口(窗口长度15,和你示例一致) window_length = 15 x_ = list(moving_window(s, window_length)) x_ = np.asarray(x_) # 开始绘图 fig, ax = plt.subplots(figsize=(12, 6)) # 绘制原始时间序列曲线 ax.plot(s, color='black', linewidth=1.5, label='原始时间序列') # 生成渐变颜色映射,用于区分不同窗口 num_windows = len(x_) cmap = plt.get_cmap('viridis') # 你可以替换成其他colormap,比如'coolwarm' norm = mcolors.Normalize(vmin=0, vmax=num_windows-1) # 遍历每个窗口,添加高亮色块 for idx, window in enumerate(x_): # 计算当前窗口的起始和结束索引(根据你的窗口无重叠特性) start_idx = idx * window_length end_idx = start_idx + window_length - 1 # 获取对应窗口的颜色 color = cmap(norm(idx)) # 填充窗口对应的x区间,半透明避免遮挡曲线 ax.fill_between([start_idx, end_idx+1], ax.get_ylim()[0], ax.get_ylim()[1], color=color, alpha=0.3) # 设置图表标签和标题 ax.set_xlabel('时间索引') ax.set_ylabel('序列值') ax.set_title('滑动窗口高亮的时间序列') # 添加颜色条,说明窗口编号与颜色的对应关系 sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm) sm.set_array([]) fig.colorbar(sm, ax=ax, label='窗口编号') # 添加图例并调整布局 ax.legend() plt.tight_layout() plt.show()
关键细节说明
- 窗口位置计算:你的示例中窗口是无重叠的(步长等于窗口长度),所以每个窗口的起始索引直接用
idx * window_length计算。如果你的窗口是有重叠的(比如步长为1),只需要把起始索引改成idx * step即可。 - 颜色与透明度:使用
alpha=0.3让填充色块半透明,既能高亮窗口范围,又不会遮挡原始时间序列的细节。你可以替换viridis为其他colormap(比如coolwarm、rainbow)来改变配色风格。 - 极端事件适配:代码里模拟了带极端值的时间序列,你只需要把
s替换成自己的真实时间序列数据即可。
内容的提问来源于stack exchange,提问作者Monali
相关产品推荐
相关产品推荐

