从特定节点矩阵在Matlab中绘制网络

时间:2016-04-20 10:16:12

标签: matlab graph

我有一个节点列表,我想在它们之间绘制间接网络。例如,我有以下内容:

S=['A0JLT2 ','A0JLT2 ','A0MZ66 ', 'A1A4E9 ', 'A1A4H1 ','A1L162 ','A1L4K1 ']

T=['Q3L8U1','Q6IAN0','Q76FK4','Q9H8H2','Q6PJR7','P05787-2',' A0A0C4DH19']

可以看出,矩阵Source形成源节点,矩阵Target形成Target节点(例如矩阵S的第一个元素,因为节点1连接到矩阵T的第一个元素作为节点2 ......等等)。

1 个答案:

答案 0 :(得分:0)

您可以使用biograph() 这个函数,给定连接矩阵(即n的方阵 - 其中n是节点数 - 1位于i,j,如果 -th节点连接到 j -th节点,否则0,最终节点ID(您的ST)将返回一个BioGraph对象,然后感谢view()函数,你可以绘制网络。

您可以在文档页面here轻松找到一些非常好的示例。我的建议是仔细阅读文档,biograph()确实是一个高度定制的强大工具:您可以获得令人惊叹的网络绘图。

我的建议是,首先将ST写为单元格数组而不是矩阵。由于单元阵列中的每个单元都更灵活,节点可以有更短/更长的名称:

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);

enter image description here