如何用Python可视化带尖峰的密集间断时间序列?
间隙式高采样率传感器时间序列的最佳可视化方案
数据特性
- 12小时内采集25万条高采样率数据点
- 分为11个连续数据段,段间存在30-40分钟的离线间隙
- 信号中位数约70,存在高达500+的尖锐尖峰
- 需要按强度分三档颜色编码:低于中位数、1-2倍中位数、高于2倍中位数,并展示阈值线
已尝试方法及问题
ax.plot():会连接间隙处的点,生成难看的长斜线- 结合LTTB降采样的
ax.scatter():点过小难以辨认或过大重叠,间隙模糊 - 按段100秒分箱的
ax.errorbar(fmt='.'):接近需求但显得杂乱,分箱会掩盖尖峰结构 - 带
where参数的彩色fill_between:颜色过渡处产生伪影
核心需求
- 间隙需清晰显示为空白(不连接)
- 尖峰需视觉突出(不被分箱平均掩盖)
- 整体趋势一目了然
- 强度颜色编码清晰
- 适合发表级图表(整洁不杂乱)
- 宽幅格式(约4400像素横向)
推荐可视化方案
方案1:分层式段感知可视化(Matplotlib实现)
结合原始数据淡显与尖峰高亮,叠加趋势线,兼顾细节与整体:
- 底层:用极细、低透明度的灰色线条绘制每个数据段的原始信号,保留尖峰细节但不干扰整体
- 中层:对每个数据段进行自适应分箱——仅对非尖峰区域用100秒分箱生成趋势线,尖峰区域直接保留原始点并高亮(红色)
- 上层:绘制中位数和2倍中位数的虚线阈值线
- 颜色编码:趋势线按强度分三档颜色(蓝色:低于中位数,橙色:1-2倍,红色:高于2倍)
关键代码片段
import numpy as np import matplotlib.pyplot as plt # 尖峰检测函数(基于阈值和斜率) def detect_spikes(r, thresh=thresh2, slope_thresh=10): spikes = np.zeros_like(r, dtype=bool) # 超过2倍中位数且斜率突变的点判定为尖峰 diff = np.diff(r) spikes[1:] = (r[1:] > thresh) & (np.abs(diff) > slope_thresh) # 扩展尖峰区域避免遗漏 for i in range(len(spikes)): if spikes[i]: spikes[max(0, i-5):min(len(spikes), i+5)] = True return spikes fig, ax = plt.subplots(figsize=(44/2.54, 10/2.54), dpi=100) # 宽幅4400px左右 for t_seg, r_seg in segments: # 1. 绘制淡色原始数据 ax.plot(t_seg, r_seg, color='gray', linewidth=0.1, alpha=0.15) # 2. 检测尖峰并高亮 spikes = detect_spikes(r_seg) if np.any(spikes): ax.scatter(t_seg[spikes], r_seg[spikes], color='#cc0000', s=5, alpha=0.8, zorder=3) # 3. 非尖峰区域分箱生成趋势线 non_spike = ~spikes if np.sum(non_spike) > 0: tb, rb, _ = bin_segment(t_seg[non_spike], r_seg[non_spike]) colors = color_for_rate(rb) for j in range(len(tb)-1): ax.plot([tb[j], tb[j+1]], [rb[j], rb[j+1]], color=colors[j], linewidth=2, solid_capstyle='round', zorder=2) # 添加阈值线 ax.axhline(thresh1, color='#2166ac', ls='--', lw=1.5, alpha=0.7) ax.axhline(thresh2, color='#cc0000', ls='--', lw=1.5, alpha=0.7) # 图表美化 ax.set_xlabel("时间(小时)", fontsize=12) ax.set_ylabel("强度", fontsize=12) ax.set_title("高采样率间隙传感器数据可视化", fontsize=14, fontweight='bold') ax.set_ylim(0, thresh2*3) ax.tick_params(labelsize=10) ax.grid(axis='y', alpha=0.1) plt.tight_layout() plt.savefig("sensor_visualization.png", dpi=100, bbox_inches='tight')
方案2:热图条+尖峰标记(Plotly实现,交互友好)
适合需要交互探索的场景:
- 将每个数据段转换为时间轴上的垂直热图条,宽度对应采样间隔,颜色按强度编码
- 在热图条上方叠加红色散点标记尖峰位置
- 添加交互式阈值线和悬停提示
方案3:段感知阶梯图(Seaborn)
用阶梯图展示每个数据段的信号变化,避免分箱丢失细节:
- 对每个数据段绘制阶梯图,颜色按实时强度编码
- 尖峰区域用加粗线条突出
- 段间自动留白,清晰区分离线间隙
方案选择建议
- 若需发表级静态图表:优先选择分层式段感知可视化,兼顾整洁性与细节保留
- 若需交互探索:选择热图条+尖峰标记方案,支持缩放、悬停查看具体数值
- 若需最小化视觉干扰:选择段感知阶梯图,用简洁的阶梯线条展示信号变化
内容的提问来源于stack exchange,提问作者requiemman
相关产品推荐
相关产品推荐

