脑电分析系列[MNE-Python-6]| Python读取.set文件和.locs文件

2022-08-17 09:32:15 浏览数 (2)

本案例主要介绍如何读取eeglab示例文件.set以及.locs文件。

.set文件记录的是采集的信息,主要内容包括通道数,事件数,开始时间与结束时间等。

.locs文件记录的是电极位置信息。

知识点:

mne中使用mne.io.read_raw_eeglab()读取.set文件;

利用mne.channels.read_custom_montage()读取.locs文件。

read_raw_eeglab()函数介绍:

代码语言:javascript复制
mne.io.read_raw_eeglab(input_fname,
                       montage='deprecated',
                       eog=(), 
                       preload=False, 
                       uint16_codec=None,
                       verbose=None)    

参数解读:

代码语言:javascript复制
input_fname:.set文件的存放路径;  
montage='deprecated':该参数已经舍弃了。在0.19版本中,它的功能可以通过set_montage方法来实现;  
eog:指定eog通道的通道名称或索引,如果设置为auto,则使用包含eog和eye的通道名称。默认情况为空元组;  
preload:类型 str或者bool 如果为True,则数据将预加载到内存中,以满足更快速的索引;  
uint16_codec:类型 str | None 允许指定读取字符数组时应用的编解码器(比如,"latin1"或者"utf-8")

案例

代码语言:javascript复制
import mne
import matplotlib.pyplot as plt

1. 利用mne.io.read_raw_eeglab来读取.set文件

代码语言:javascript复制
"""
通过mne.io.read_raw_eeglab来读取.set文件
得到原始数据对象
"""
raw = mne.io.read_raw_eeglab("Eeglab_data.set",preload=False)

2. 绘制从第5s开始,5s时间窗口长的原始数据

代码语言:javascript复制
"""
绘制从第5s开始,5s时间窗口长的原始数据

start:指定开始绘制的时间
duration:要绘制的时间窗口

从该图中可以看出每个通道的数据波动情况
可以通过设置duration的大小来放大或缩小

这个有点类似于eeglab中,放大缩小功能。
这里相同大小的窗口显示更短时间的数据,相当于eeglab中的选中数据进行放大,
反之,即缩小。
"""
raw.plot(start=5, duration=5)
plt.show()
代码语言:javascript复制
"""
设置duration=1,相当于放大
"""
raw.plot(start=5, duration=1)
plt.show()

3. 通常raw的数据访问方式如下:

data, times = raw[picks, time_slice]

picks:是根据条件挑选出来的索引;

time_slice:时间切片

想要获取raw中所有数据,以下两种方式均可:

data,times=raw[:]

data,times=raw[:,:]

代码语言:javascript复制
"""
获取1-3秒内的EEG数据
获取前5条 时间从1秒开始到3秒为止的数据
raw[:5,int(sfreq*1):int(sfreq*3)]
"""

sfreq=raw.info['sfreq']
data,times=raw[:5,int(sfreq*1):int(sfreq*3)]
plt.plot(times,data.T)
plt.title("Sample channels")

4.读取.locs文件

首先查看原始数据中的通道名称:

代码语言:javascript复制
"""
打印通道名
"""
print(raw.info['ch_names'])
代码语言:javascript复制
['EEG 000', 'EEG 001', 'EEG 002', 'EEG 003', 'EEG 004', 'EEG 005', 'EEG 006', 'EEG 007', 'EEG 008', 'EEG 009', 'EEG 010', 'EEG 011', 'EEG 012', 'EEG 013', 'EEG 014', 'EEG 015', 'EEG 016', 'EEG 017', 'EEG 018', 'EEG 019', 'EEG 020', 'EEG 021', 'EEG 022', 'EEG 023', 'EEG 024', 'EEG 025', 'EEG 026', 'EEG 027', 'EEG 028', 'EEG 029', 'EEG 030', 'EEG 031']

从上述打印的结果可以看到,原始数据中通道名称并非电极位置的命名,因此需要将其映射成电极位置名称。

代码语言:javascript复制
mapping = {
    'EEG 000': 'FPz', 'EEG 001': 'EOG1', 'EEG 002': 'F3', 'EEG 003': 'Fz',
    'EEG 004': 'F4', 'EEG 005': 'EOG2', 'EEG 006': 'FC5', 'EEG 007': 'FC1',
    'EEG 008': 'FC2', 'EEG 009': 'FC6', 'EEG 010': 'T7', 'EEG 011': 'C3',
    'EEG 012': 'C4', 'EEG 013': 'Cz', 'EEG 014': 'T8', 'EEG 015': 'CP5',
    'EEG 016': 'CP1', 'EEG 017': 'CP2', 'EEG 018': 'CP6', 'EEG 019': 'P7',
    'EEG 020': 'P3', 'EEG 021': 'Pz', 'EEG 022': 'P4', 'EEG 023': 'P8',
    'EEG 024': 'PO7', 'EEG 025': 'PO3', 'EEG 026': 'POz', 'EEG 027': 'PO4',
    'EEG 028': 'PO8', 'EEG 029': 'O1', 'EEG 030': 'Oz', 'EEG 031': 'O2'
}
# 根据映射名对原始数据中的通道名进行重命名
raw.rename_channels(mapping)
"""
读取.locs文件,.locs文件记录的是电极头皮位置
"""
montage=mne.channels.read_custom_montage("eeglab_chan32.locs")
"""
设置脑电图中传感器配置(电极位置配置)
"""
raw.set_montage(montage,raise_if_subset=False)
代码语言:javascript复制
"""
打印设置电极位置后的通道名
"""
print(raw.info['ch_names'])
代码语言:javascript复制
['FPz', 'EOG1', 'F3', 'Fz', 'F4', 'EOG2', 'FC5', 'FC1', 'FC2', 'FC6', 'T7', 'C3', 'C4', 'Cz', 'T8', 'CP5', 'CP1', 'CP2', 'CP6', 'P7', 'P3', 'Pz', 'P4', 'P8', 'PO7', 'PO3', 'POz', 'PO4', 'PO8', 'O1', 'Oz', 'O2']

5.绘制电极位置

代码语言:javascript复制
# 绘制电极位置
raw.plot_sensors()
plt.show()
代码语言:javascript复制
"""
绘制通道位置图,并对应位置上显示通道名称
"""
layout_from_raw = mne.channels.make_eeg_layout(raw.info)
layout_from_raw.plot()
plt.show()
代码语言:javascript复制
"""
上述效果也可通过
mne.channels.find_layout(raw.info, ch_type='eeg')
来读取
"""
layout_from_raw =mne.channels.find_layout(raw.info, ch_type='eeg')
layout_from_raw.plot()
plt.show()

6.绘制各通道的功率谱密度

代码语言:javascript复制
"""
绘制各通道的功率谱密度
"""
raw.plot_psd()
plt.show()
代码语言:javascript复制
"""
绘制采样频率在30Hz到70Hz之间,且只考虑40s到50s之间的所有通道的PSD
"""
raw.plot_psd(fmin=30, fmax=70, tmin=40,tmax=50.0,spatial_colors=True)
plt.show()
代码语言:javascript复制
"""
绘制采样频率在30Hz到70Hz之间,且只考虑40s到50s之间的所有通道的平均PSD
"""
raw.plot_psd(fmin=30, fmax=70, tmin=40,tmax=50.0,average=True)
plt.show()

0 人点赞