公司动态
BrainNet Viewer脑网络可视化:MATLAB科研绘图高效解决方案
1. 从零开始为什么你需要BrainNet Viewer如果你正在用MATLAB处理脑影像数据比如fMRI、EEG/MEG的源定位结果或者结构像的皮层分区那你大概率遇到过一个问题怎么把大脑激活图或者网络连接图画得既专业又好看MATLAB自带的绘图函数比如scatter3、plot3画个简单的三维散点还行但一旦涉及到复杂的大脑皮层表面、激活区域渲染、网络连线代码就会变得异常臃肿效果也往往差强人意离发表级图表总差那么点意思。这就是BrainNet Viewer出场的时候了。我第一次接触它是在处理一批静息态功能磁共振数据的网络分析结果时。手头有几十个被试的脑功能连接矩阵需要把显著的功能连接边以“连线”的形式投射到一个标准大脑模板上直观展示出哪些脑区之间的连接增强了或减弱了。用纯MATLAB代码硬写光是把大脑皮层表面模型读进来、渲染、上色再根据坐标画线、调整透明度就花了我整整两天结果还经常因为视角、光照问题导致某些连线被遮挡看不清楚。后来实验室的师兄扔给我一个脚本里面就调用了两个函数BrainNet_LoadFile和BrainNet_Viewer。运行之后一个带光照、可旋转、能分层显示的大脑三维图就出来了节点和连线清晰美观。那一刻的感觉就像从手工打磨零件突然换上了数控机床。BrainNet Viewer本质上是一个基于MATLAB的、专门用于大脑网络可视化特别是基于节点的网络如功能连接、结构连接的开源工具包。它帮你把最繁琐的底层图形渲染工作打包好了你只需要准备好数据节点坐标、节点属性、连线信息调用它的接口就能快速生成高质量的可视化结果极大地提升了科研效率让你能把精力集中在数据分析和解读上而不是和图形API较劲。它特别适合以下几类人神经科学、心理学、生物医学工程领域的研究生和科研人员需要处理脑电、脑磁、磁共振脑网络数据的分析者以及任何希望将大脑三维空间中的统计结果如激活簇、损伤病灶、电极/探针位置进行可视化展示的人。即使你MATLAB编程只是入门水平按照它的数据格式要求准备文件也能很快上手。接下来我就以一个从数据准备到出图的完整流程带你走一遍BrainNet Viewer的核心使用路径。2. 核心文件准备你的数据需要“对号入座”BrainNet Viewer的输入核心是三个文件节点文件.node、边文件.edge和可选的表面模型文件.nv。它的工作逻辑很清晰根据节点文件确定大脑中各个“点”的位置和外观根据边文件确定哪些“点”之间有连接以及连线的样式最后将这些元素绘制在指定的脑表面模型上。很多新手觉得难往往卡在第一步——数据格式不对。2.1 节点文件.node定义网络的“车站”节点文件是一个文本文件通常保存为.node后缀。它定义了网络中每个节点的空间坐标和属性。其标准格式是每行一个节点共6列以空格或制表符分隔X坐标 Y坐标 Z坐标 颜色 大小 标签前3列坐标这是最重要的决定了节点在三维空间中的位置。通常使用标准脑空间坐标如蒙特利尔神经研究所MNI坐标或塔拉伊拉赫Talairach坐标。例如一个位于左侧前额叶的节点坐标可能是-40, 20, 30。第4列颜色控制节点的颜色。这里可以输入一个数字BrainNet Viewer会根据你选择的颜色映射Colormap将这个数字映射为具体颜色。常用于表示节点的某种属性值比如节点度、中心性指标、组间差异的t值等。如果你只想让所有节点显示为同一颜色可以在这一列全部填1然后在软件界面选择单一颜色。第5列大小控制节点的显示尺寸。同样是一个数字数字越大节点在图中显示得越大。可以用来可视化节点的另一个属性比如参与系数。如果不需要大小变化可以全部设为相同的值比如1。第6列标签节点的名称或编号这是一个字符串。在最终出图时可以选择是否显示这些标签。对于AAL自动解剖标记脑区这里可以写脑区缩写如PreCG_L左侧中央前回。一个简单的.node文件内容示例-40.2 20.1 30.5 2.5 1.2 PreCG_L 42.3 -5.6 15.8 1.8 0.8 PreCG_R 0.0 -30.5 25.0 3.0 1.5 ACC这里三个节点分别用颜色值2.5, 1.8, 3.0和大小值1.2, 0.8, 1.5来编码信息标签分别是三个脑区。实操心得在实际操作中我通常先用SPM、DPABI等工具得到激活簇的峰值点坐标MNI坐标或者用脑网络工具包如GRETNA、BRANT计算出网络节点的MNI坐标。然后写一个简单的MATLAB脚本将这些坐标连同计算好的节点属性如度中心性输出成.node格式。最容易出错的地方是分隔符务必确保是空格或Tab不要混用逗号。可以用MATLAB的dlmwrite函数指定分隔符为 空格或\tTab。2.2 边文件.edge定义“车站”间的“铁路”边文件定义了节点之间的连接关系通常保存为.edge后缀。它是一个N x N的方阵N为节点数以文本形式存储。矩阵的第i行第j列的值表示节点i和节点j之间的连接强度或是否存在连接。例如一个3个节点的全连接网络其.edge文件内容可能如下0 0.7 0.3 0.7 0 0.5 0.3 0.5 0这是一个对称矩阵对角线一般为0表示节点与自身无连接。值可以是二进制的0或1表示有无连接也可以是加权的如功能连接中的相关系数、结构连接中的纤维数量。BrainNet Viewer在绘图时会根据这个矩阵的值来决定是否画线以及连线的粗细/颜色。注意事项BrainNet Viewer在可视化时默认会绘制所有非零的边。如果你的网络非常稠密比如全脑90个AAL脑区功能连接阈值化后可能还有上千条边直接绘制会导致图形一团乱麻根本无法辨认。因此在生成.edge文件前务必对连接矩阵进行合理的阈值化处理。例如只保留相关性最强的前10%的边或者只保留统计检验显著的边p 0.01并经过FDR校正。这一步通常在之前的网络分析中完成。2.3 表面文件.nv提供绘图的“舞台”表面文件是大脑皮层表面的三角网格模型定义了绘图的三维“舞台”。BrainNet Viewer自带了一些标准模板BrainMesh_ICBM152.nv: 最常用的ICBM152标准大脑模板左右半球合并。BrainMesh_ICBM152_smoothed.nv: 平滑后的版本表面更光滑。BrainMesh_Ch2.nv: 基于Colin27高精度模板细节更丰富。还有单独的左半球 (BrainMesh_ICBM152Left.nv)、右半球 (BrainMesh_ICBM152Right.nv) 和子皮层 (BrainMesh_Ch2_subcortex.nv) 模板。对于绝大多数发表级图表使用BrainMesh_ICBM152_smoothed.nv就足够了。它的路径通常在BrainNet Viewer安装目录的Data/SurfTemplate文件夹下。你不需要修改这个文件只需要在调用时指定它的路径。3. 一键可视化GUI界面快速上手对于初学者或快速查看数据使用图形用户界面GUI是最直接的方式。确保你已经将BrainNet Viewer的文件夹及其子文件夹添加到MATLAB的搜索路径中。启动GUI在MATLAB命令窗口输入BrainNet并回车会弹出主界面。加载文件表面文件 (Surf): 点击...导航到BrainNet Viewer/Data/SurfTemplate/选择BrainMesh_ICBM152_smoothed.nv。节点文件 (Node): 点击...选择你准备好的.node文件。边文件 (Edge): 点击...选择你准备好的.edge文件。点击“Draw”如果文件格式正确一个三维大脑图像就会在一个新的图形窗口中渲染出来。初次绘图后的常见问题与调整节点/边看不见可能是节点坐标不在大脑表面附近比如坐标是voxel索引而非MNI坐标或者边矩阵的值全部为0。检查坐标单位应是毫米和边矩阵是否已阈值化。图形窗口一片灰可能是视角问题。在图形窗口你可以用鼠标直接拖拽来旋转大脑滚轮缩放右键拖拽平移。多转一转节点和边可能就在另一侧。想调整颜色、大小、标签关闭图形窗口回到BrainNet主界面。在点击“Draw”之前主界面上有Options按钮。点击后会出现一个包含多个选项卡的设置窗口这是进行深度定制的关键。4. 深度定制通过Options打造发表级图表Options对话框是BrainNet Viewer的灵魂掌握了它你就能完全掌控图表的每一个细节。它主要包含以下几个选项卡4.1 表面设置 (Surface)这里控制大脑表面的外观。颜色 (Color)可以设置整个大脑表面的颜色。默认是灰色材质感。你可以改为纯白 ([1 1 1]) 以获得更干净的背景或者浅灰色 ([0.9 0.9 0.9])。透明度 (Alpha)值为1表示完全不透明0表示完全透明。适当降低透明度如0.6-0.8可以让被表面遮挡的节点和边若隐若现增加层次感。材质 (Material)shiny光亮、dull暗淡、metal金属等。shiny搭配适当的光照能突出大脑沟回的立体感是发表文章中常见的样式。光照 (Lighting)勾选Lighting并设置光照位置和强度能极大增强三维立体感。通常使用从左上角照射的光源。4.2 节点设置 (Node)这里精细化控制节点的显示。尺寸 (Size)你可以选择Fixed固定大小所有节点一样大或Custom自定义读取.node文件第5列。如果.node文件第5列是连续变量这里还可以设置尺寸映射的范围 (Size Range)。颜色 (Color)这是最常用的定制项。选择Color Map然后从下拉菜单中选一个色图如jet彩虹色、hot热力图、cool、winter等。.node文件第4列的值将根据你选的色图进行映射。你还可以通过Color Range手动设置映射的数据范围这对于统一多组图表的颜色标尺至关重要。标签 (Label)可以开关节点标签显示设置标签字体、颜色、大小。如果节点太多显示所有标签会非常杂乱建议只显示关键脑区的标签。4.3 边设置 (Edge)控制网络连线的外观。连线方式 (Line Style)Straight直线或Spline曲线。曲线看起来更柔和但直线在科学图表中更常见。粗细 (Size)和节点类似可以选择固定粗细或根据.edge文件中的连接强度值来自定义 (Link Connection Value)。通常将连接强度映射到线条粗细上强度越大线越粗这样一目了然。颜色 (Color)线条颜色也可以映射。可以选择一个独立的色图或者选择Interpolated插值这样线条的颜色会根据其两端节点的颜色进行渐变效果很炫酷但有时会显得杂乱。对于功能连接我通常用单一深色如深蓝或深灰只通过粗细表达强度。阈值 (Threshold)这是一个极其重要的选项。即使你在.edge文件中已经做了阈值化这里还可以设置一个显示阈值。比如.edge文件里是相关系数矩阵你可以在这里设置只显示绝对值大于0.6的边让图形更简洁。4.4 布局与视角 (Layout View)视图 (View)预设了一些标准视角如Left左视图、Right右视图、Top顶视图、Front前视图、Back后视图。在GUI中手动旋转到一个满意的角度后可以点击Get View按钮获取当前的视角参数方位角az和仰角el记录下来以便在脚本中复现。图形输出 (Figure)可以设置图形窗口的尺寸Figure Size单位是像素。对于发表建议设置一个较大的、高宽比合适的尺寸比如[1200, 900]。务必勾选Display in new figure这样每次绘制都会在新窗口避免覆盖。调整完所有选项后点击Apply或OK然后回到主界面点击Draw就能看到定制后的效果。反复调整直到满意为止。5. 脚本化操作实现批量处理与可重复性使用GUI交互调整虽然直观但无法批量处理多个数据且每次手动设置难以保证完全一致。对于严肃的科研工作必须将流程脚本化。BrainNet Viewer提供了函数接口最核心的是BrainNet_Viewer函数。一个最基本的脚本化绘图示例% 假设 BrainNet Viewer 工具箱路径已添加 % 定义文件路径 surf_file BrainNet Viewer/Data/SurfTemplate/BrainMesh_ICBM152_smoothed.nv; node_file my_results/group_network.node; edge_file my_results/group_network.edge; % 方法1最简单调用使用默认设置 BrainNet_Viewer(surf_file, node_file, edge_file);运行这段代码效果和在GUI中加载三个文件后点击“Draw”一样。但我们需要定制。这时需要用到第四个参数一个包含所有选项设置的结构体cfg。手动构建这个cfg很复杂但BrainNet Viewer提供了一个非常方便的函数BrainNet_LoadCfg来从之前保存的配置文件中加载。高效工作流在GUI中调出一张完美的图按照第4节的方法在Options中仔细调整表面、节点、边、视角等所有参数直到得到一张你满意的图。保存配置在Options对话框的右下角有一个Save按钮。点击它将当前的所有设置保存为一个.mat文件比如my_paper_fig_setting.mat。在脚本中加载配置并批量绘图surf_file BrainNet Viewer/Data/SurfTemplate/BrainMesh_ICBM152_smoothed.nv; node_files {subj01.node, subj02.node, subj03.node}; % 多个节点文件 edge_files {subj01.edge, subj02.edge, subj03.edge}; % 多个边文件 cfg_file my_paper_fig_setting.mat; % 你保存的配置文件 % 加载配置 cfg BrainNet_LoadCfg(cfg_file); for i 1:length(node_files) % 为每个被试绘图 BrainNet_Viewer(surf_file, node_files{i}, edge_files{i}, cfg); % 保存图片需要借助MATLAB的saveas或exportgraphics函数 % 先获取当前图形窗口的句柄假设BrainNet_Viewer创建了新窗口 fig_handle gcf; output_filename sprintf(network_figure_subj%02d.png, i); % 方法1saveas (分辨率可能不高) % saveas(fig_handle, output_filename, png); % 方法2exportgraphics (推荐可设置高DPI) exportgraphics(fig_handle, output_filename, Resolution, 300); % 关闭当前图形窗口准备绘制下一个 close(fig_handle); end通过这个流程你可以确保为几十甚至上百个被试生成的网络图其颜色映射、视角、光照、字体大小等所有视觉元素完全一致这对于科学研究中的组间比较和论文插图至关重要。6. 高级技巧与避坑指南掌握了基础流程下面分享一些能让你事半功倍、避开常见陷阱的高级技巧。6.1 处理重叠节点与边让图形清晰可辨当节点非常密集比如基于AAL 90脑区模板或者边非常多时图形会变得一团糟。节点层面可以考虑不显示所有节点只显示那些具有显著属性如高节点度的节点。这需要在生成.node文件时就根据你的统计指标对节点进行筛选。边层面如前所述严格的阈值化是关键。不要展示全连接矩阵。可以尝试设置一个绝对的强度阈值如只保留相关系数 0.3 的边。设置一个相对的密度阈值如只保留每个节点最强的5条连接。结合统计检验只保留组间差异显著的边p 0.05, FDR校正。可视化技巧在Options的Edge设置中可以适当降低线条的透明度 (Alpha)这样重叠的线条会因叠加而颜色加深反而能暗示连接的密集程度。也可以尝试用Spline曲线有时比直线更容易区分。6.2 制作组间对比图并排显示与差分网络这是科研中的常见需求。并排显示最简单的方法是分别生成两组如健康对照组 vs 患者组的图形然后用PPT、Adobe Illustrator或MATLAB的subplot/tiledlayout功能将它们拼在一起。关键是要确保两张图使用完全相同的配置.mat文件特别是颜色映射的范围 (Color Range)、视角和光照否则对比会失真。差分网络有时我们想直接可视化组间有差异的连接。这时需要创建一个新的.edge文件其中的值代表组间差异的统计量如t值。节点文件可以沿用任意一组的或者用两组平均的节点属性。绘制时用双色发散色图如coolwarm来映射这个差分.edge文件红色表示患者组连接增强蓝色表示减弱一目了然。6.3 导出高分辨率图片满足期刊要求GUI界面和默认的saveas函数导出的图片分辨率往往不够。脚本导出如上节所示使用exportgraphics函数MATLAB R2020a及以上版本是首选。可以方便地设置ResolutionDPI建议300或600和BackgroundColor通常设为none以获得透明背景方便后期排版。矢量图对于出版期刊通常接受PDF或EPS格式的矢量图这样可以无限放大不失真。可以使用saveas(gcf, ‘figure.pdf’, ‘pdf’)或print(‘-dpdf’, ‘-r600’, ‘figure.pdf’)导出PDF。但注意如果图形非常复杂数万条边矢量文件可能会非常大打开和渲染缓慢。这时高分辨率PNG600 DPI是更实用的选择。手动调整后的保存如果你在图形窗口手动旋转、缩放到了最佳视角可以在命令窗口使用view命令获取当前视角参数[az, el]记录下来并更新到你的cfg配置中实现脚本化复现。6.4 常见报错与排查错误: “File not found” 或 “Unable to read file”检查文件路径是否正确尤其是相对路径和绝对路径。在脚本开头使用cd命令切换到数据所在目录或使用绝对路径是最稳妥的。确保文件没有正在被其他程序打开。错误: “Index exceeds matrix dimensions”这通常意味着.node文件和.edge文件的维度不匹配。.edge文件应该是N x N的方阵N等于.node文件的行数节点数。用MATLAB的load或dlmread函数检查两个文件加载后的矩阵维度。图形元素显示不全或错位首先检查节点坐标是否在合理范围内MNI空间大致是±90mm, ±120mm, ±90mm。如果坐标是voxel索引如91x109x91需要转换为毫米坐标。其次检查表面模板是否匹配比如用了左半球模板但节点坐标包含了右半球。颜色映射显示异常如果所有节点/边都显示为同一种颜色检查.node文件第4列或.edge文件的值是否变化过小或全部相同。确认在Options中正确设置了Color Map和Color Range并且映射模式Custom选择正确。BrainNet Viewer是一个强大且持续维护的工具。当你熟悉了这些基础操作后还可以探索其更多高级功能比如绘制脑切片视图、集成统计结果进行显著性标注等。它的核心价值在于将你从繁琐的三维编程中解放出来让你能更专注于科学问题本身。开始动手用你的数据生成第一张图在实践中遇到和解决具体问题是掌握它的最快方式。