MNE SSP learning recording——Example: Environmental noise reduction from empty-room recordings

博主在尝试MNE的SSP(Signal Space Projection)教程时,遇到pycharm中无法正确显示示例图的问题。尽管尝试了更换mne版本、安装依赖库、切换源等方法,仍然无法解决第二排图像空白和图像拼接问题。分析可能与matplotlib版本和源代码中matplotlib.pyplot.subplots及enumerate方法有关。博主期待社区的帮助,并提出希望MNE官方提供涉及库的版本信息以简化问题定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MNE SSP learning recording——Example: Environmental noise reduction from empty-room recordings(https://mne.tools/stable/auto_tutorials/preprocessing/50_artifact_correction_ssp.html#tut-artifact-ssp)

记录以下在这次学习中出现的问题(未解决),欢迎指出问题!

1. pycharm上编写如下代码:
import os
import numpy as np
import matplotlib.pyplot as plt
import mne
from mne.preprocessing import (create_eog_epochs, create_ecg_epochs,
                               compute_proj_ecg, compute_proj_eog)
sample_data_folder = mne.datasets.sample.data_path()
sample_data_raw_file = os.path.join(sample_data_folder, 'MEG', 'sample',
                                    'sample_audvis_raw.fif')
# sample_data_raw_file = sample_data_raw_file.replace("\\", "/")
raw = mne.io.read_raw_fif(sample_data_raw_file)

system_projs = raw.info['projs']
raw.del_proj()
empty_room_file = os.path.join(sample_data_folder, 'MEG', 'sample',
                               'ernoise_raw.fif')
empty_room_raw = mne.io.read_raw_fif(empty_room_file)

empty_room_raw.del_proj()

for average in (False, True):
    empty_room_raw.plot_psd(average=average, dB=False, xscale='log')
    plt.show()

empty_room_projs = mne.compute_proj_raw(empty_room_raw, n_grad=3, n_mag=3)
mne.viz.plot_projs_topomap(empty_room_projs, colorbar=True, vlim='joint',
                           info=empty_room_raw.info)
plt.show()

fig, axs = plt.subplots(2, 3)
for idx, _projs in enumerate([system_projs, empty_room_projs[3:]]):
    mne.viz.plot_projs_topomap(_projs, axes=axs[idx], colorbar=True,
                               vlim='joint', info=empty_room_raw.info)
	plt.show()

mags = mne.pick_types(raw.info, meg='mag')
for title, projs in [('system', system_projs),
                     ('subject-specific', empty_room_projs[3:])]:
    raw.add_proj(projs, remove_existing=True)
    fig = raw.plot(proj=True, order=mags, duration=1, n_channels=2)
    fig.subplots_adjust(top=0.9)  # make room for title
    fig.suptitle('{} projectors'.format(title), size='xx-large', weight='bold')
    plt.show()
运行结果如下——(运行结果与官网一致,这里引用官网原图)

这里的图片也与官网顺序不一样
在这里插入图片描述

问题出现在下面这里:

在这里插入图片描述
我的代码在pycharm里面运行后就只有第一排的三个图,第二排是空白的,之后还以一个空白的图片,如下所示,
在这里插入图片描述
在这里插入图片描述
尝试切换pycharm sci-view设置选项也无法解决,后注意到官网这里的mne版本
在这里插入图片描述
果断使用pip3 install -U mne==0.24.0安装新版本的mne后运行提示没用import
pooch package,又在pip3 install pooch且imoprt pooch后运行还是没有改变,因该不是mne版本问题!做到这,我怀疑是编译器pycharm的问题,于是使用anaconda安装好mne0.24.0版本和pooch package后重新编写上述代码,还是一样的效果——
与pycharm不同在于(顺序和官网一样了)
在这里插入图片描述
但是这里怎么变这么多了
在这里插入图片描述
老问题
在这里插入图片描述
想着之前好像安装pydot模块也遇到过这样的伪版本问题,怕不是清华镜像的问题,上https://anaconda.org/查看搜索mne看看,
在这里插入图片描述

下载一大堆库…

在这里插入图片描述
在这里插入图片描述

再试试

还是如上一样的运行结果…

但是不管怎样,最终结果还是和官网一样的——
在这里插入图片描述

做到这里后又仔细看了几遍官网关于的该example的讲解,还是没发现端倪,这里希望是换源的影响,这里我用的是清华源,不知道有没有遇到同样问题的并成功解决该问题或者成功做出该example的大佬指点一下,感激不尽!!!

今日又仔细看了一下,想了一些思路,只能把文章中的图分别输出,关于python中matplotlib.pyplot.subplots api和enumerate方法(不太看懂 😦 )也去看了一下,仍没有找出问题,下面说一下我今天的解决思路(未果!,可能是matplotlib的版本差异,我的是3.3.3版本的,大家如果不是这个版本的使用mne官方的源码实现出来了无比告诉我,非常感谢 😃)

官网预期效果图——

在这里插入图片描述

自己实现的效果图——

在这里插入图片描述
在这里插入图片描述

分析源码:
fig, axs = plt.subplots(2, 3)
for idx, _projs in enumerate([system_projs, empty_room_projs[3:]]):
    mne.viz.plot_projs_topomap(_projs, axes=axs[idx], colorbar=True,
                               vlim='joint', info=empty_room_raw.info)
1. 首先我事先在这个for循环中print(idx),发现两个值0和1,遂使用以下语句看看能不能得到期望的图,结果还是gg:
mne.viz.plot_projs_topomap(system_projs, axes=axs[0], colorbar=True,
                               vlim='joint', info=empty_room_raw.info)
mne.viz.plot_projs_topomap(empty_room_projs[3:], axes=axs[1], colorbar=True,
                               vlim='joint', info=empty_room_raw.info)
输出还是带有空白
2. 这次想着如何去第1个思路基础上去掉空白:
fig, axs = plt.subplots(2, 3)
for idx, _projs in enumerate([system_projs, empty_room_projs[3:]]):
    if idx==0:
        mne.viz.plot_projs_topomap(system_projs, axes=axs[0], colorbar=True,
                                   vlim='joint', info=empty_room_raw.info)
    else:
        break
输出如下——

在这里插入图片描述

虽然第二个空白图像消失了,但是下方的empty_room_projs[3:]却怎么也放不上去,实在不知道如何处理了,同求大佬指点迷津!

3. 想着图像拼接,也没能实现,想着保存到本地,也实现不了,保存的是一片空白,保存了个寂寞 😦!我查了viz.plot_projs_topomap()这个方法返回的的确是figure对象,这么这么难用呢?请大佬指点迷津!

在这里插入图片描述

4. 最后的两个图今天才发现问题,问什么是两个图???坑爹的pycharm,应该是我换了mne版本的问题!

在这里插入图片描述

下面是我最好修改好的代码,只能分别显示两个projs图像!见谅!希望能和大家一起讨论,找出解决方案!

import os
import numpy as np
import matplotlib.pyplot as plt
import mne

import PIL.Image as Image

import pooch
from mne.preprocessing import (create_eog_epochs, create_ecg_epochs,
                               compute_proj_ecg, compute_proj_eog)
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)

system_projs = raw.info['projs']
raw.del_proj()
empty_room_file = os.path.join(sample_data_folder, 'MEG', 'sample',
                               'ernoise_raw.fif')
empty_room_raw = mne.io.read_raw_fif(empty_room_file)

empty_room_raw.del_proj()  # 去除投影

for average in (False, True):
    empty_room_raw.plot_psd(average=average, dB=False, xscale='log')

empty_room_projs = mne.compute_proj_raw(empty_room_raw, n_grad=3, n_mag=3)
mne.viz.plot_projs_topomap(empty_room_projs, colorbar=True, vlim='joint',
                           info=empty_room_raw.info)

# fig, axs = plt.subplots(2, 3)
# for idx, _projs in enumerate([system_projs, empty_room_projs[3:]]):
#     if idx==0:
#         mne.viz.plot_projs_topomap(system_projs, axes=axs[0], colorbar=True,
#                                    vlim='joint', info=empty_room_raw.info)
#     # elif idx==1:
#     #     mne.viz.plot_projs_topomap(empty_room_projs[3:], axes=axs[0], colorbar=True,
#     #                                vlim='joint', info=empty_room_raw.info)
#     else:
#         break

mne.viz.plot_projs_topomap(system_projs, colorbar=True,
                                   vlim='joint', info=empty_room_raw.info)
mne.viz.plot_projs_topomap(empty_room_projs[3:], colorbar=True,
                           vlim='joint', info=empty_room_raw.info)


# for idx, _projs in enumerate([system_projs, empty_room_projs[3:]]):
#     # if idx==0:
#     #     idx=0
#     mne.viz.plot_projs_topomap(system_projs, axes=axs[1], colorbar=True,
#                                    vlim='joint', info=empty_room_raw.info)

    # elif idx==1:
    #     idx=1
    #     mne.viz.plot_projs_topomap(_projs, axes=axs[idx], colorbar=True,
    #                                vlim='joint', info=empty_room_raw.info)
    # else:
    #     break
# idx = 1
# mne.viz.plot_projs_topomap(empty_room_projs[3:], colorbar=True,
#                            vlim='joint', info=empty_room_raw.info)


mags = mne.pick_types(raw.info, meg='mag')
for title, projs in [('system', system_projs),
                     ('subject-specific', empty_room_projs[3:])]:
    raw.add_proj(projs, remove_existing=True)
    fig = raw.plot(proj=True, order=mags, duration=1, n_channels=2)
    fig.subplots_adjust(top=0.9)  # make room for title
    fig.suptitle('{} projectors'.format(title), size='xx-large', weight='bold')
    plt.show()

events = mne.find_events(raw, stim_channel='STI 014')
event_id = {'auditory/left': 1}

# NOTE: appropriate rejection criteria are highly data-dependent
reject = dict(mag=4000e-15,     # 4000 fT
              grad=4000e-13,    # 4000 fT/cm
              eeg=150e-6,       # 150 µV
              eog=250e-6)       # 250 µV

# time range where we expect to see the auditory N100: 50-150 ms post-stimulus
times = np.linspace(0.05, 0.15, 5)

epochs = mne.Epochs(raw, events, event_id, proj='delayed', reject=reject)
fig = epochs.average().plot_topomap(times, proj='interactive')
plt.show()

最后,吐槽以下python的版本控制,真的太乱了,太复杂了,感觉一般的函数确实学习成本低,而且方便,但是复杂的函数就真的很难以接受,学习成本不低,期间我也尝试过python换源和使用初始源安装mne,以及在pycharm上挑选mne版本,但还是没能解决上述问题,还有就是希望mne、各大镜像都能够统一版本,不要又那么多更新迭代,并且希望mne官网在编写example时能加上所涉及的各类库的版本,让我们能更快定位问题,减少理解时间并更高效和更愉悦的开发!!! 😃,同时也要感谢mne官网关于example的分享和编写!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值