MNE学习笔记(七):Evoked data的可视化

2024-01-14 18:20

本文主要是介绍MNE学习笔记(七):Evoked data的可视化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MNE学习笔记(七):Evoked data的可视化

参考文章:https://mne.tools/stable/auto_tutorials/evoked/20_visualize_evoked.html

准备工作

这里就不再解释了,具体可以查看MNE学习笔记(四):Evoked数据结构。

代码:

import os
import numpy as np
import mne
from matplotlib import pyplot as plt# 如果没有数据则用这个自动下载
# sample_data_folder = mne.datasets.sample.data_path()
# 已有数据,则直接加载即可
sample_data_folder = "D:\Data\MNE-sample-data"
sample_data_evk_file = os.path.join(sample_data_folder, 'MEG', 'sample','sample_audvis-ave.fif')
evokeds_list = mne.read_evokeds(sample_data_evk_file, baseline=(None, 0),proj=True, verbose=False)# Show the condition names, and reassure ourselves that baseline correction has been applied.
for e in evokeds_list:print(f'Condition: {e.comment}, baseline: {e.baseline}')# convert that list of Evoked objects into a dictionary
conds = ('aud/left', 'aud/right', 'vis/left', 'vis/right')
evks = dict(zip(conds, evokeds_list))
#      ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ this is equivalent to:
# {'aud/left': evokeds_list[0], 'aud/right': evokeds_list[1],
#  'vis/left': evokeds_list[2], 'vis/right': evokeds_list[3]}

结果:

image-20210902185530005

绘制信号追踪图(signal traces)

Evoked对象最基本的图是每一个channel类型的蝴蝶图(butterfly plot),这是由evoked.plot()方法生成的。默认情况下,‘bad’ channel会被排除,但是可以通过将一个空的list传递给exclude参数(默认为exclude='bads')对它进行控制:

代码:

# signal trace
evks['aud/left'].plot(exclude=[])
plt.show()

结果:

image-20210902192547843 image-20210902192613337

evoked.plot()参数含义

  • picks参数:可以让我们通过name、index或者type来选择channel。这里展示一下只选择magnetometer channel的图。
  • spatial_colors=True:根据它们的位置用颜色编码通道轨迹。
  • gfp=True:叠加/添加对信号的均方根(RMS - Root Mean Square)的追踪(trace)。

代码:

# pick spatial_color gfp
evks['aud/left'].plot(picks='mag', spatial_colors=True, gfp=True)
plt.show()

结果:

image-20210903103323708

选择一段之后:

image-20210903103447687

绘制头皮地形图(scalp topographies)

通过plot_topmap方法可以生成特定时间的头皮地形图。

代码:

# 头皮地形图
times = np.linspace(0.05, 0.13, 5)
evks['aud/left'].plot_topomap(ch_type='mag', times=times, colorbar=True)
plt.show()

结果:

image-20210903110307139 image-20210903110439966

也可以对时间进行指定

代码:

# 指定time = 0.09
fig = evks['aud/left'].plot_topomap(ch_type='mag', times=0.09, average=0.1)
fig.text(0.5, 0.05, 'average from 40-140 ms', ha='center')
plt.show()

结果

image-20210903110621124 image-20210903110809887

绘制箭头地图(Arrow maps)

上面的头皮地形图通过mne.viz.plot_arrowmap来生成显示估计磁场的大小和方向的箭头。

代码:

# 箭头地图
mags = evks['aud/left'].copy().pick_types(meg='mag')
mne.viz.plot_arrowmap(mags.data[:, 175], mags.info, extrapolate='local')
plt.show()

结果:

image-20210903111300340

绘制联合图(Joint plots)

联合图结合了butterfly plots和scalp topographies,并提供了evoked data的一种美观的展示方式。默认中地形图会被自动基于peak finding放置。联合图也可以选取特定时间来进行绘制。

代码:

# 联合图
evks['vis/right'].plot_joint()
plt.show()

结果

image-20210903112139270 image-20210903111831216

选取一段后:

image-20210903111927043
image-20210903111937418

选取一段后:

image-20210903112001570
image-20210903112016364

选取一段后:

image-20210903112048152

对比Evoked对象

可以采用mne.viz.plot_compare_evokeds来对比不同实验环境下的Evoked对象。它有可以用来选取channnel的pick参数,默认下为每一个channel类型生成一个图。

代码:

# 对比图
def custom_func(x):return x.max(axis=1)
for combine in ('mean', 'median', 'gfp', custom_func):mne.viz.plot_compare_evokeds(evks, picks='eeg', combine=combine)
plt.show()

结果:

image-20210903113132833 image-20210903113115518 image-20210903113145419 image-20210903113157884 image-20210903113215329

可以对图进行定制,这里我们对aud和vis情况下进行颜色的选择,对left和right情况进行线条的选择。

代码:

# 定制对比图
mne.viz.plot_compare_evokeds(evks, picks='MEG 1811', colors=dict(aud=0, vis=1),linestyles=dict(left='solid', right='dashed'))
plt.show()

结果:

image-20210903114842012

如果传递的是一个Evoked对象的列表或元组,则legend键将被Evoked对象的comment属性自动生成。

代码:

# 传入元组或列表
temp_list = list()
for idx, _comment in enumerate(('foo', 'foo', '', None, 'bar'), start=1):_evk = evokeds_list[0].copy()_evk.comment = _comment_evk.data *= idx  # so we can tell the traces aparttemp_list.append(_evk)
mne.viz.plot_compare_evokeds(temp_list, picks='mag')
plt.show()

结果:

image-20210903115749820 image-20210903115846190

图像映射(Image plots)

evoked_image()显示每个row的channel

代码:

# image plot
evks['vis/right'].plot_image(picks='meg')
plt.show()

结果:

image-20210903120230721

绘制次地形图(Topographical subplots)

对于sensor级的分析,在地形布局中绘制每个sensor的响应是有用的。 如果传递axes='topo'plot_compare_evakes函数可以进行这样的绘制,但如果传感器的数量太大,它可能会非常慢,所以这里我们只绘制脑电图通道:

代码:

# 次地形图
mne.viz.plot_compare_evokeds(evks, picks='eeg', colors=dict(aud=0, vis=1),linestyles=dict(left='solid', right='dashed'),axes='topo', styles=dict(aud=dict(linewidth=1),vis=dict(linewidth=1)))
plt.show()

结果:

image-20210903121045335

对于大量的sensors,可以使用ecoked.plot_topo()mne.viz.plot_evoked_topo方法。

ecoked.plot_topo()仅绘制一个情况的。

mne.viz.plot_evoked_topo可以在相同坐标下绘制多个情况的,默认下绘制所有MEG sensors。

代码:

# 大量sensors
mne.viz.plot_evoked_topo(evokeds_list)
plt.show()

结果:

image-20210903121603257 image-20210903121623047

3D区域图(3D Field Maps)

为了能实现3D的效果,需要一个trans文件来对MEG设备和头表面(基于MRI)之间的坐标系进行位置转变。当然,也可以不用trans文件,但是这只能计算MEG头盔上的sensor。

代码:

# 读取trans文件
subjects_dir = os.path.join(sample_data_folder, 'subjects')
sample_data_trans_file = os.path.join(sample_data_folder, 'MEG', 'sample','sample_audvis_raw-trans.fif')

默认下,MEG传感器(sensor)用于估计头盔表面的磁场,EEG传感器(sensor)用于估计头皮上的磁场。 一旦计算出映射,就可以使用invoke .plot_field()来绘制它们:

如果报错RuntimeError: Could not load any valid 3D backend: pyvista, mayavi, notebook,则安装这三个backend。

pip install pyvista
pip install notebook
// 还有mayavi的安装,这个比较复杂

关于mayavi的安装,请查看https://blog.csdn.net/qq_45347768/article/details/120082562

如果又报错:ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject,这是因为numpy版本问题,重装numpy即可

pip uninstall numpy
pip install numpy

之后要进行UI工具的安装,在mayavi的安装里面我也已经说明了,建议安装PyQt4。

最后是显示的问题,如果图片一闪而过,则需要在代码的最后加一个input()

代码:

# 绘制3D图
maps = mne.make_field_map(evks['aud/left'], trans=sample_data_trans_file,subject='sample', subjects_dir=subjects_dir)
evks['aud/left'].plot_field(maps, time=0.1)
plt.show()
input()

结果:

image-20210903170410752 image-20210903170435457

同时也可以通过传入meg_surf='head'使用MEG sensors来估计头皮区域。

代码:

for ch_type in ('mag', 'grad', 'eeg'):evk = evks['aud/right'].copy().pick(ch_type)_map = mne.make_field_map(evk, trans=sample_data_trans_file,subject='sample', subjects_dir=subjects_dir,meg_surf='head')fig = evk.plot_field(_map, time=0.1)mne.viz.set_3d_title(fig, ch_type, size=20)
plt.show()
input()

结果:

image-20210903170751634 image-20210903170808066 image-20210903170817177

完整代码

import os
import numpy as np
import mne
from matplotlib import pyplot as plt# 如果没有数据则用这个自动下载
# sample_data_folder = mne.datasets.sample.data_path()
# 已有数据,则直接加载即可
sample_data_folder = "D:\Data\MNE-sample-data"
sample_data_evk_file = os.path.join(sample_data_folder, 'MEG', 'sample','sample_audvis-ave.fif')
evokeds_list = mne.read_evokeds(sample_data_evk_file, baseline=(None, 0),proj=True, verbose=False)# Show the condition names, and reassure ourselves that baseline correction has been applied.
for e in evokeds_list:print(f'Condition: {e.comment}, baseline: {e.baseline}')# convert that list of Evoked objects into a dictionary
conds = ('aud/left', 'aud/right', 'vis/left', 'vis/right')
evks = dict(zip(conds, evokeds_list))
#      ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ this is equivalent to:
# {'aud/left': evokeds_list[0], 'aud/right': evokeds_list[1],
#  'vis/left': evokeds_list[2], 'vis/right': evokeds_list[3]}# signal trace
evks['aud/left'].plot(exclude=[])
plt.show()# pick spatial_color gfp
evks['aud/left'].plot(picks='mag', spatial_colors=True, gfp=True)
plt.show()# 头皮地形图
times = np.linspace(0.05, 0.13, 5)
evks['aud/left'].plot_topomap(ch_type='mag', times=times, colorbar=True)
plt.show()# 指定time = 0.09
fig = evks['aud/left'].plot_topomap(ch_type='mag', times=0.09, average=0.1)
fig.text(0.5, 0.05, 'average from 40-140 ms', ha='center')
plt.show()# 箭头地图
mags = evks['aud/left'].copy().pick_types(meg='mag')
mne.viz.plot_arrowmap(mags.data[:, 175], mags.info, extrapolate='local')
plt.show()# 联合图
evks['vis/right'].plot_joint()
plt.show()# 对比图
def custom_func(x):return x.max(axis=1)
for combine in ('mean', 'median', 'gfp', custom_func):mne.viz.plot_compare_evokeds(evks, picks='eeg', combine=combine)
plt.show()# 定制对比图
mne.viz.plot_compare_evokeds(evks, picks='MEG 1811', colors=dict(aud=0, vis=1),linestyles=dict(left='solid', right='dashed'))
plt.show()# 传入元组或列表
temp_list = list()
for idx, _comment in enumerate(('foo', 'foo', '', None, 'bar'), start=1):_evk = evokeds_list[0].copy()_evk.comment = _comment_evk.data *= idx  # so we can tell the traces aparttemp_list.append(_evk)
mne.viz.plot_compare_evokeds(temp_list, picks='mag')
plt.show()# image plot
evks['vis/right'].plot_image(picks='meg')
plt.show()# 次地形图
mne.viz.plot_compare_evokeds(evks, picks='eeg', colors=dict(aud=0, vis=1),linestyles=dict(left='solid', right='dashed'),axes='topo', styles=dict(aud=dict(linewidth=1),vis=dict(linewidth=1)))
plt.show()# 大量sensors
mne.viz.plot_evoked_topo(evokeds_list)
plt.show()# 3D
# 读取trans文件
subjects_dir = os.path.join(sample_data_folder, 'subjects')
sample_data_trans_file = os.path.join(sample_data_folder, 'MEG', 'sample','sample_audvis_raw-trans.fif')# 绘制3D图
maps = mne.make_field_map(evks['aud/left'], trans=sample_data_trans_file,subject='sample', subjects_dir=subjects_dir)
evks['aud/left'].plot_field(maps, time=0.1)
plt.show()
input()for ch_type in ('mag', 'grad', 'eeg'):evk = evks['aud/right'].copy().pick(ch_type)_map = mne.make_field_map(evk, trans=sample_data_trans_file,subject='sample', subjects_dir=subjects_dir,meg_surf='head')fig = evk.plot_field(_map, time=0.1)mne.viz.set_3d_title(fig, ch_type, size=20)
plt.show()
input()

这篇关于MNE学习笔记(七):Evoked data的可视化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/606086

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1