本案例主要介绍如何读取eeglab示例文件.set以及.locs文件。
.set文件记录的是采集的信息,主要内容包括通道数,事件数,开始时间与结束时间等。
.locs文件记录的是电极位置信息。
知识点:
mne中使用mne.io.read_raw_eeglab()读取.set文件;
利用mne.channels.read_custom_montage()读取.locs文件。
read_raw_eeglab()函数介绍:
mne.io.read_raw_eeglab(input_fname,
montage='deprecated',
eog=(),
preload=False,
uint16_codec=None,
verbose=None)
参数解读:
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")
案例
import mne
import matplotlib.pyplot as plt
1. 利用mne.io.read_raw_eeglab来读取.set文件
"""
通过mne.io.read_raw_eeglab来读取.set文件
得到原始数据对象
"""
raw = mne.io.read_raw_eeglab("Eeglab_data.set",preload=False)
2. 绘制从第5s开始,5s时间窗口长的原始数据
"""
绘制从第5s开始,5s时间窗口长的原始数据
start:指定开始绘制的时间
duration:要绘制的时间窗口
从该图中可以看出每个通道的数据波动情况
可以通过设置duration的大小来放大或缩小
这个有点类似于eeglab中,放大缩小功能。
这里相同大小的窗口显示更短时间的数据,相当于eeglab中的选中数据进行放大,
反之,即缩小。
"""
raw.plot(start=5, duration=5)
plt.show()
"""
设置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[:,:]
"""
获取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文件
首先查看原始数据中的通道名称:
"""
打印通道名
"""
print(raw.info['ch_names'])
['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']
从上述打印的结果可以看到,原始数据中通道名称并非电极位置的命名,因此需要将其映射成电极位置名称。
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)
"""
打印设置电极位置后的通道名
"""
print(raw.info['ch_names'])
['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.绘制电极位置
# 绘制电极位置
raw.plot_sensors()
plt.show()
"""
绘制通道位置图,并对应位置上显示通道名称
"""
layout_from_raw = mne.channels.make_eeg_layout(raw.info)
layout_from_raw.plot()
plt.show()
"""
上述效果也可通过
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.绘制各通道的功率谱密度
"""
绘制各通道的功率谱密度
"""
raw.plot_psd()
plt.show()
"""
绘制采样频率在30Hz到70Hz之间,且只考虑40s到50s之间的所有通道的PSD
"""
raw.plot_psd(fmin=30, fmax=70, tmin=40,tmax=50.0,spatial_colors=True)
plt.show()
"""
绘制采样频率在30Hz到70Hz之间,且只考虑40s到50s之间的所有通道的平均PSD
"""
raw.plot_psd(fmin=30, fmax=70, tmin=40,tmax=50.0,average=True)
plt.show()
不用于商业行为,转载请联系后台
若有侵权,请后台留言,管理员即时删侵!
QQ交流群:913607986