结果图
Nilearn
Nilearn是一个Python库,用于神经影像分析。它提供了处理和分析功能性和结构性脑成像数据的工具。Nilearn提供了多种预处理函数、机器学习算法应用、统计分析和结果可视化的功能。在神经影像研究领域,Nilearn常用于分析功能性磁共振成像(fMRI)等技术的数据。通过Nilearn,研究人员可以对大脑活动进行定量分析、图像处理和模式识别,帮助推动神经科学研究的发展。
Nilearn 可视化
Nilearn 的plotting模块提供了体素空间和皮层的绘图方法,可以绘制结构像、时间序列、神经影像结果的可视化比如ROI绘制、分区图绘制、脑网络图绘制、检验结果绘制等神经影像研究中常用的各种类型的图片。
如何绘制脑连接图
脑连接图的绘制基于nilearn中的plotting.plot_connectome()函数,下面主要介绍一下该函数的参数,方便使用时根据需要定制。
使用该函数绘制脑连接图主要需要提供两个数据,需要使用者导入:
- 第一个adjacency_matrix:是一个N*N的矩阵,该矩阵如果是对阵的则为无向图,若为非对阵的则为有向图,矩阵中的值用来标识节点之间的连接强度。比如:
A | C | D | E | ||
---|---|---|---|---|---|
A | 1 | 2 | 3 | 4 | 5 |
B | 2 | 1 | 7 | 8 | 9 |
C | 3 | 7 | 1 | 11 | 12 |
D | 4 | 8 | 11 | 1 | 14 |
E | 5 | 9 | 12 | 14 | 1 |
- 第二个node_coords:是一个N*3矩阵,每一行表示网络中节点的MNI坐标。两个参数中的N值相同都表示矩阵中节点的数目。
节点 | X | Y | Z |
---|---|---|---|
1 | -30 | -10 | 20 |
2 | 10 | 0 | 45 |
3 | -15 | 25 | -5 |
4 | 40 | -5 | 30 |
5 | -5 | -40 | 15 |
- 其他参数说明(部分)
node_color(颜色或颜色序列或'auto',可选):节点的颜色。如果给定单一字符串,则所有节点都将以该字符串中的相同颜色绘制,比如'#1a2b3c'。
node_size(标量或数组样式,可选):节点的大小(以点为单位)。
edge_cmap(色图,可选):用于表示边缘强度的色图。默认为cm.bwr。
edge_vmin、edge_vmax(浮点数,可选):如果不为None,则这些值将用作边缘的最小值和最大值进行着色。如果未提供,则将在给定阈值内使用最大绝对值作为最小值(乘以-1)和最大值进行着色。
edge_threshold(字符串或数字,可选):如果它是一个数字,则只显示值大于edge_threshold的边。如果它是一个字符串,它必须以百分号结尾,例如"25.3%",则只显示绝对值超过给定百分位的边。
output_file(字符串或None,可选):要导出绘图的图像文件的名称。有效的扩展名为.png、.pdf、.svg。如果output_file不为None,则将绘图保存到文件,并关闭显示。
display_mode(字符串,可选):选择切片的方向:'' - 状面,'y' - 冠状面,'z' - 轴向,'l' - 仅左半球矢状面,'r' - 仅右半球矢状面,'ortho' - 在正交方向上进行三个切片。可能的取值为:'ortho'、'x'、'y'、'z'、'xz'、'yx'、'yz'、'l'、'r'、'lr'、'lzr'、'lyr'、'lzry'、'lyrz'。默认为'ortho'。
figure(整数或matplotlib.figure.Figure或None,可选):要使用的Matplotlib图形或其编号。如果给定None,则创建一个新的图形。
axes(matplotlib.axes.Axes或4个浮点数的元组(xmin、ymin、width、height),可选):用于显示绘图的Axes或坐标,在matplotlib图形空间中。如果为None,则使用完整的图形。
title(字符串或None,可选):在图形上显示的标题。默认为None。
annotate(布尔值,可选):如果annotate为True,则添加位置和左/右注释到绘图中。默认为True。
black_bg(布尔值或'auto',可选):如果为True,则将图像的背景设置为黑色。如果希望保存具有黑色背景的图形,需要将facecolor='k'、edgecolor='k'传递给matplotlib.pyplot.savefig。默认为False。
alpha(0和1之间的浮点数,可选):脑模型透明度。默认为0.7。
colorbar(布尔值,可选):如果为True,则在绘图右侧显示一个颜色条。默认为False。
完整Demo 绘制脑网络
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 26 21:53:19 2023
@author: LB
"""
### 完整Demo
from nilearn import plotting
# import scipy.io as scio
import pylab as pl
# import numpy as np
def main():
# data_path = "~\\node_distribution_TLE.mat" # 输入网络文件的地址
# data_org = scio.loadmat(data_path)
strength = [1,2,3,4,5] # 网络节点强度(n*1)
strength_list = [100 * i for i in strength] # 可以根据节点的值控制节点的大小
data_position = [[-30,-10,20],
[10,0,45],
[-15,25,-5],
[40,-5,30],
[-5,-40,15]] # 存放节点的MNI坐标(n*3
data_mat = [[1,-2,3.5,1.1,-2],
[-2,1,7,-3.5,0.8],
[3.5,7,1,6.6,0.6],
[1.1,-3.5,6.6,1,3.5],
[-2,0.8,0.6,3.5,1]]
# data_mat = np.zeros((len(data_position), len(data_position))) # 图个只想显示节点,可以产生了一个0矩阵
#colors = ['#B9A3AE', '#D2CCC5', '#C0BEC7', '#B0A4C2', '#D3C0BB', '#BFA58A', '#D9C6B0', '#E8DBC5', '#E6D4D1', '#E0BBE4']
# node_color_list = ['#B9A3AE', '#D2CCC5', '#BFA58A', '#D9C6B0', '#E8DBC5'] # 节点的颜色值(n*1 放置 )
node_color_list = '#00CCCC'
figure1 = pl.figure(figsize=(12, 6))
plotting.plot_connectome(data_mat,
data_position,
node_color_list,
colorbar=True,
edge_cmap='rainbow', # 用来显示边的强度
edge_threshold=0.0,
node_size=strength_list,
# edge_vmin=2,
# edge_vmax=3,
alpha=0.7,
figure=figure1
)
pl.savefig('.\\test.png', dpi=600) # 输出文件的地址
plotting.show()
print('ending')
if __name__ == '__main__':
main()
- 结果图
完整Demo 如果只显示节点,且每个节点显示不一样的颜色
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 26 21:53:19 2023
@author: LB
"""
from nilearn import plotting
# import scipy.io as scio
import pylab as pl
import numpy as np
def main():
# data_path = "~\\node_distribution_TLE.mat" # 输入网络文件的地址
# data_org = scio.loadmat(data_path)
strength = [1,2,3,4,5] # 网络节点强度(n*1)
strength_list = [100 * i for i in strength] # 可以根据节点的值控制节点的大小
data_position = [[-30,-10,20],
[10,0,45],
[-15,25,-5],
[40,-5,30],
[-5,-40,15]] # 存放节点的MNI坐标(n*3
# data_mat = [[1,-2,3.5,1.1,-2],
# [-2,1,7,-3.5,0.8],
# [3.5,7,1,6.6,0.6],
# [1.1,-3.5,6.6,1,3.5],
# [-2,0.8,0.6,3.5,1]]
data_mat = np.zeros((len(data_position), len(data_position))) # 图个只想显示节点,可以产生了一个0矩阵
#colors = ['#B9A3AE', '#D2CCC5', '#C0BEC7', '#B0A4C2', '#D3C0BB', '#BFA58A', '#D9C6B0', '#E8DBC5', '#E6D4D1', '#E0BBE4']
node_color_list = ['#1967db', '#1c61e6', '#4c27ba', '#dd0922', '#e40a1e'] # 节点的颜色值(n*1 放置 )
# node_color_list = '#00CCCC'
figure1 = pl.figure(figsize=(12, 6))
plotting.plot_connectome(data_mat,
data_position,
node_color_list,
colorbar=False,
edge_cmap='rainbow', # 选择colormap用来显示边的强度
edge_threshold=0.0,
node_size=strength_list,
# edge_vmin=2,
# edge_vmax=3,
alpha=0.7,
figure=figure1
)
pl.savefig('.\\test2.png', dpi=600) # 输出文件的地址
plotting.show()
print('ending')
if __name__ == '__main__':
main()
说明
具体使用时,只需要导入自己的网络连接数据,如功能连接矩阵、结构连接矩阵赋值连接矩阵;导入节点的MNI坐标赋值给节点即可生成对应。如果只显示节点,就对应生成一个矩阵,矩阵的边为0即可。使用我给出的默认参数即可,具体其它的参数可以继续尝试。