我有一个节点列表,我想在它们之间绘制间接网络。例如,我有以下内容:
S=['A0JLT2 ','A0JLT2 ','A0MZ66 ', 'A1A4E9 ', 'A1A4H1 ','A1L162 ','A1L4K1 ']
T=['Q3L8U1','Q6IAN0','Q76FK4','Q9H8H2','Q6PJR7','P05787-2',' A0A0C4DH19']
可以看出,矩阵Source形成源节点,矩阵Target形成Target节点(例如矩阵S的第一个元素,因为节点1连接到矩阵T的第一个元素作为节点2 ......等等)。
答案 0 :(得分:0)
您可以使用biograph()
这个函数,给定连接矩阵(即n
的方阵 - 其中n
是节点数 - 1
位于i,j
,如果我 -th节点连接到 j -th节点,否则0
,最终节点ID(您的S
和T
)将返回一个BioGraph对象,然后感谢view()
函数,你可以绘制网络。
您可以在文档页面here轻松找到一些非常好的示例。我的建议是仔细阅读文档,biograph()
确实是一个高度定制的强大工具:您可以获得令人惊叹的网络绘图。
我的建议是,首先将S
和T
写为单元格数组而不是矩阵。由于单元阵列中的每个单元都更灵活,节点可以有更短/更长的名称:
S={'A0JLT2','A0JLT2','A0MZ66', 'A1A4E9', 'A1A4H1','A1L162','A1L4K1'};
T={'Q3L8U1','Q6IAN0','Q76FK4','Q9H8H2','Q6PJR7','P05787-2','A0A0C4DH19'};
之前你所做的是由于字符串连接而创建一个长字符串,但这是Matlab如何处理" row" chars array。
因此,总共有13个节点,是时候将边缘列表(源 - 目标对)转换为邻接矩阵(或连接矩阵)。首先,让我们使用唯一ID映射每个节点名称,您可以轻松地执行以下操作:
nodeIDs=unique([S,T]);
for i=1:length(nodeIDs)
mapTable{i,1}=i;
mapTable{i,2}=nodeIDs{i};
end
和mapTable
将采用以下格式:
mapTable =
[ 1] 'A0A0C4DH19'
[ 2] 'A0JLT2'
[ 3] 'A0MZ66'
[ 4] 'A1A4E9'
[ 5] 'A1A4H1'
[ 6] 'A1L162'
[ 7] 'A1L4K1'
[ 8] 'P05787-2'
[ 9] 'Q3L8U1'
[10] 'Q6IAN0'
[11] 'Q6PJR7'
[12] 'Q76FK4'
[13] 'Q9H8H2'
现在您创建邻接矩阵,如上所述:
AdjMatrix=zeros(length(nodeIDs)); % start matrix as all zeros
for i=1:length(S) % since length(S)=length(T) you can use either the former or the latter
idxS=find(cellfun(@(x) strcmp(x,S{i}),mapTable(:,2))); % find the index in mapTable for the i-th element in S
idxT=find(cellfun(@(x) strcmp(x,T{i}),mapTable(:,2))); % same as above but with i-th element from T
AdjMatrix(idxS,idxT)=1; % set that element as 1
end
创建BioGraph对象并显示:
bobj=biograph(AdjMatrix,nodeIDs);
view(bobj);