You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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实现)

结合原始数据淡显与尖峰高亮,叠加趋势线,兼顾细节与整体:

  1. 底层:用极细、低透明度的灰色线条绘制每个数据段的原始信号,保留尖峰细节但不干扰整体
  2. 中层:对每个数据段进行自适应分箱——仅对非尖峰区域用100秒分箱生成趋势线,尖峰区域直接保留原始点并高亮(红色)
  3. 上层:绘制中位数和2倍中位数的虚线阈值线
  4. 颜色编码:趋势线按强度分三档颜色(蓝色:低于中位数,橙色: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实现,交互友好)

适合需要交互探索的场景:

  1. 将每个数据段转换为时间轴上的垂直热图条,宽度对应采样间隔,颜色按强度编码
  2. 在热图条上方叠加红色散点标记尖峰位置
  3. 添加交互式阈值线和悬停提示

方案3:段感知阶梯图(Seaborn)

用阶梯图展示每个数据段的信号变化,避免分箱丢失细节:

  1. 对每个数据段绘制阶梯图,颜色按实时强度编码
  2. 尖峰区域用加粗线条突出
  3. 段间自动留白,清晰区分离线间隙

方案选择建议

  • 若需发表级静态图表:优先选择分层式段感知可视化,兼顾整洁性与细节保留
  • 若需交互探索:选择热图条+尖峰标记方案,支持缩放、悬停查看具体数值
  • 若需最小化视觉干扰:选择段感知阶梯图,用简洁的阶梯线条展示信号变化

内容的提问来源于stack exchange,提问作者requiemman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:27:33