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
相关产品推荐
相关产品推荐

