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

动态绘制EEG数据通道:非0通道无间隙绘制问题求助

解决EEG指定通道无间隙动态绘图问题

问题分析

核心问题在于未正确处理含"0"的传感器列表,导致两种异常:

  1. 错误填充数据:未跳过"0"通道,直接通过index_lookup["0"]获取索引,绘制了错误的通道数据。
  2. 空白间隙:跳过"0"后仍使用原列表的索引设置子图位置,导致子图布局出现空缺。

解决方案

先过滤出所有非"0"的有效通道,再根据有效通道数量动态创建子图,确保布局紧凑无间隙。修改后的代码如下:

if "Time" in plots:
    print("Computing Time Series...")
    # 过滤出非0的有效通道
    valid_channels = [ch for ch in sensors_to_plot if ch != "0"]
    num_valid = len(valid_channels)
    if num_valid == 0:
        print("No valid channels to plot!")
        return
    
    fig = plt.figure(facecolor=(1, 1, 1))
    axs_for_plot = []
    
    # 遍历有效通道,用新索引设置子图位置
    for plot_idx, channel_name in enumerate(valid_channels):
        # 子图布局改为有效通道数×1,位置按连续索引排列
        ax = fig.add_subplot(num_valid, 1, plot_idx + 1)
        chan_idx = index_lookup[channel_name]
        ax.set_title(f"Sensor {chan_idx}/{channel_name}")
        pl = ax.plot(timestamps - timestamps[18], eeg[:, chan_idx])
        
        # 在中间位置设置ylabel,适配动态通道数量
        if plot_idx == num_valid // 2:
            ax.set_ylabel("Voltage (uV)")
        
        axs_for_plot.append([ax, chan_idx, pl[0]])
    
    # 给最后一个有效子图设置xlabel
    axs_for_plot[-1][0].set_xlabel("Time (s)")
    
    bprev = Button(plt.axes([0.025, 0.05, 0.05, 0.9]), "<")
    bnext = Button(plt.axes([0.925, 0.05, 0.05, 0.9]), ">")
    win_len = TextBox(
        plt.axes([0.45, 0.95, 0.05, 0.03]), "Window Length (s)", "5", label_pad=0.05
    )

    callback = Index(axs_for_plot)
    bprev.on_clicked(callback.prev_win)
    bnext.on_clicked(callback.next_win)
    win_len.on_text_change(callback.change_w_len)
    callback.update_plots()
    plt.tight_layout()  # 自动调整子图间距,避免标题、标签重叠
    plt.show()

关键修改点

  • 过滤有效通道:用列表推导式提前筛选出需要绘制的通道,同时判断有效通道数量,避免空绘图场景。
  • 动态子图布局:子图行数设为有效通道数,子图位置使用连续的新索引,确保子图从上到下无间隙排列。
  • 标签位置适配:根据有效通道的中间索引设置ylabel,给最后一个有效子图设置xlabel,避免原代码中可能出现的ax未定义问题。
  • 自动调整布局:添加plt.tight_layout()避免子图元素重叠。

额外优化建议

针对*拼接的传感器参数,可以在拆分时直接过滤,提前得到有效通道列表:

# 假设sensor_param是传入的*拼接字符串
sensor_param = "FT7*Fpz*0*O2*0*0*AF8*0*0*0*0*Fz*0*0*0*0"
sensors_to_plot = [ch.strip() for ch in sensor_param.split("*") if ch.strip() != "0"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:05:57