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

Python EEG PSD绘图曲线数量不符合预期问题求助

EEG PSD绘图出现多余曲线问题排查

问题描述

用下方Python代码绘制EEG功率谱密度(PSD)时,原本只想生成两名被试各1个通道的PSD曲线,但实际输出了4条曲线。已尝试取消子图设置、确认数据维度一致,问题仍未解决。

原代码

import os
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import welch

os.chdir("/Users/bob/Downloads/")

eeg_group1 = np.load('Subject01_2.edf')
eeg_group2 = np.load('Subject09_1.edf')

psd_group1_all = []
freqs_group1_all = []
psd_group2_all = []
freqs_group2_all = []

for i in range(eeg_group1.shape[1]):
    # Calculate PSD using Welch method
    psd_group1, freqs_group1 = welch(
        eeg_group1[:, i], fs=250, nperseg=1024, noverlap=512
    )
    psd_group2, freqs_group2 = welch(
        eeg_group2[:, i], fs=250, nperseg=1024, noverlap=512
    )

    psd_group1_all.append(psd_group1)
    freqs_group1_all.append(freqs_group1)
    psd_group2_all.append(psd_group2)
    freqs_group2_all.append(freqs_group2)

plt.figure(figsize=(10, 6))
for i in range(eeg_group1.shape[1]):
    plt.plot(
        freqs_group1_all[i],
        np.log10(psd_group1_all[i]),
        label=f'EEG Group 1, Channel {i + 1}',
        linestyle='--',
    )
    plt.plot(
        freqs_group2_all[i],
        np.log10(psd_group2_all[i]),
        label=f'EEG Group 2, Channel {i + 1}',
        linestyle='-',
    )

plt.xlabel('Frequency (Hz)')
plt.ylabel('Power (dB/Hz)')
plt.title('Power Spectral Density (PSD)')
plt.legend()
plt.grid(True)
plt.show()

问题原因

代码里的两个for循环都是基于eeg_group1.shape[1]遍历,这个值是被试1的EEG通道总数。如果Subject01_2.edf包含2个通道,循环会执行2次:

  • 第一次循环:绘制被试1通道1、被试2通道1的曲线
  • 第二次循环:绘制被试1通道2、被试2通道2的曲线
    最终就会生成4条曲线,和你看到的结果一致。

解决方案

如果只需要两名被试各1个通道的曲线,直接去掉循环,指定单个通道处理即可,比如选择第1个通道(索引为0):

修改后的代码

import os
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import welch

os.chdir("/Users/bob/Downloads/")

eeg_group1 = np.load('Subject01_2.edf')
eeg_group2 = np.load('Subject09_1.edf')

# 直接处理第1个通道(索引0)
psd_group1, freqs_group1 = welch(
    eeg_group1[:, 0], fs=250, nperseg=1024, noverlap=512
)
psd_group2, freqs_group2 = welch(
    eeg_group2[:, 0], fs=250, nperseg=1024, noverlap=512
)

plt.figure(figsize=(10, 6))
# 绘制两条目标曲线
plt.plot(
    freqs_group1,
    np.log10(psd_group1),
    label='EEG Group 1, Channel 1',
    linestyle='--',
)
plt.plot(
    freqs_group2,
    np.log10(psd_group2),
    label='EEG Group 2, Channel 1',
    linestyle='-',
)

plt.xlabel('Frequency (Hz)')
plt.ylabel('Power (dB/Hz)')
plt.title('Power Spectral Density (PSD)')
plt.legend()
plt.grid(True)
plt.show()

如果需要指定其他通道,把索引0改成对应通道序号减1即可(比如第2个通道用1)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:55:54