前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >脑电分析系列[MNE-Python-12]| 注释连续数据

脑电分析系列[MNE-Python-12]| 注释连续数据

作者头像
脑机接口社区
发布2022-08-17 09:46:43
4990
发布2022-08-17 09:46:43
举报
文章被收录于专栏:脑机接口

注释连续数据(Annotating continuous data)

本案例主要介绍如何向原始(Raw)对象添加注释,以及在数据处理的后期阶段如何使用注释。

Raw:原始对象 Annotations:注释

导入工具包

代码语言:javascript
复制
import os
from datetime import datetime
import mne

sample_data_folder = mne.datasets.sample.data_path()
sample_data_raw_file = os.path.join(sample_data_folder, 'MEG', 'sample',
                                    'sample_audvis_raw.fif')
raw = mne.io.read_raw_fif(sample_data_raw_file, verbose=False)
# 只截取60s的数据
raw.crop(tmax=60).load_data()

MNE-Python中的注释是一种存储关于原始对象的时间跨度的短字符串信息的方法。 注释是类似列表的对象,其中每个元素包含三部分信息:起始时间(以秒为单位)、持续时间(也以秒为单位)和描述(文本字符串)。 此外,annotation对象本身也跟踪orig_time,它是一个POSIX时间戳,表示相对于注释开始的真实时间。

通过代码创建注释

如果事先知道要注释的原始对象的跨度,可以通过编程来创建注释,甚至可以将列表或数组传递给Annotations的构造函数来同时注释多个跨度:

代码语言:javascript
复制
my_annot = mne.Annotations(onset=[3, 5, 7],
                           duration=[1, 0.5, 0.25],
                           description=['AAA', 'BBB', 'CCC'])
print(my_annot)
代码语言:javascript
复制
<Annotations | 3 segments : AAA (1), BBB (1), CCC (1), orig_time : None>

注意,orig_time是None,因为我们还没有指定它。在这些情况下,当您将注释添加到原始(Raw)对象时,假设orig_time与记录的第一个样本的时间相匹配,因此将设置orig_time以匹配记录的测量日期(Raw.info['meas_date'])。

代码语言:javascript
复制
raw.set_annotations(my_annot)
print(raw.annotations)

# 构建事件戳
meas_date = raw.info['meas_date'][0] + raw.info['meas_date'][1] / 1e6
orig_time = raw.annotations.orig_time
print(meas_date == orig_time)
代码语言:javascript
复制
<Annotations | 3 segments : AAA (1), BBB (1), CCC (1), orig_time : 2002-12-03 19:01:10.720100>
True

由于示例数据来自Neuromag系统,该系统在记录开始之前就开始对样品编号进行计数,因此将my_annot添加到Raw对象还涉及另一个自动更改:偏移量等于第一个记录的样品的时间(raw.first_samp / raw.info [ 'sfreq'])已添加到每个注释的初始值中.

代码语言:javascript
复制
time_of_first_sample = raw.first_samp / raw.info['sfreq']
print(my_annot.onset + time_of_first_sample)
print(raw.annotations.onset)
代码语言:javascript
复制
[45.95597083 47.95597083 49.95597083]
[45.95597088 47.95597088 49.95597088]

如果知道注释的开始时间是相对于其他时间的,则可以在调用set_annotations()之前设置orig_time, 然后开始时间将根据指定的orig_time与raw.info ['meas_date']之间的时差进行调整。这里我们将使用ISO 8601格式的字符串,并将其设置为比raw.info ['meas_date']晚50秒。

代码语言:javascript
复制
time_format = '%Y-%m-%d %H:%M:%S.%f'
new_orig_time = datetime.utcfromtimestamp(meas_date + 50).strftime(time_format)
print(new_orig_time)

later_annot = mne.Annotations(onset=[3, 5, 7],
                              duration=[1, 0.5, 0.25],
                              description=['DDD', 'EEE', 'FFF'],
                              orig_time=new_orig_time)

raw2 = raw.copy().set_annotations(later_annot)
print(later_annot.onset)
print(raw2.annotations.onset)
代码语言:javascript
复制
2002-12-03 19:02:00.720100
[3. 5. 7.]
[53. 55. 57.]

上述已将注释添加到原始对象中了,可以可视化的原始对象来进行查看:

可视化原始对象

代码语言:javascript
复制
fig = raw.plot(start=2, duration=6)

这三个注释显示为不同颜色的矩形,因为它们具有不同的描述值(沿绘图区域的顶部边缘打印)。在绘图窗口底部可以看到彩色跨度出现在绘图窗口底部的小滚动条中,这有助于快速查看注释在Raw对象中的位置。

交互式注释原始对象

也可以通过在绘图窗口中单击并拖动鼠标以交互方式将注释添加到Raw对象。要做到这一点,首先进入"注释模式",将调出注释窗口。注释控件窗口:

代码语言:javascript
复制
%matplotlib auto
fig.canvas.key_press_event('a')

对注释对象的操作

只要注释对象共享相同的orig_time,就可以通过简单地用+运算符添加来组合注释对象:

代码语言:javascript
复制
new_annot = mne.Annotations(onset=3.75, duration=0.75, description='AAA')
raw.set_annotations(my_annot + new_annot)
raw.plot(start=2, duration=6)

说明:即使共享相同的描述,也可以创建重叠的注释。这在交互注释时是不可能的; 单击并拖动创建与具有相同描述的现有注释重叠的新注释,将导致新旧注释合并。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 脑机接口社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 注释连续数据(Annotating continuous data)
    • 通过代码创建注释
      • 可视化原始对象
        • 交互式注释原始对象
          • 对注释对象的操作
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档