我有一个节点列表,我想在它们之间画一个间接网络。例如,我有以下内容:
S=['A0JLT2 ','A0JLT2 ','A0MZ66 ', 'A1A4E9 ', 'A1A4H1 ','A1L162 ','A1L4K1 ']
T=['Q3L8U1','Q6IAN0','Q76FK4','Q9H8H2','Q6PJR7','P05787-2',' A0A0C4DH19']可以看出,矩阵源形成源节点,矩阵目标形成目标节点(例如,矩阵S的第一个元素作为节点1连接到矩阵T的第一个元素作为节点2.等等)。
发布于 2016-04-20 11:24:19
您可以使用biograph()。
这样的函数,给定连接矩阵(即阶n的平方矩阵,其中n是节点数),如果第一个节点连接到第j节点和0,则1位于i,j位置),最终节点in (您的S和T)将返回一个BioGraph对象,然后由于view()函数,您可以绘制网络。
您也可以很容易地在文档页这里上找到一些很好的例子。我的建议是仔细阅读文档,biograph()确实是一个强大的工具,具有高度的定制性:您可以获得惊人的网络绘图。
我的建议是,首先将S和T写成单元格数组而不是矩阵。由于单元格数组中的每个单元格都更灵活,节点可以有更短/更长的名称:
S={'A0JLT2','A0JLT2','A0MZ66', 'A1A4E9', 'A1A4H1','A1L162','A1L4K1'};
T={'Q3L8U1','Q6IAN0','Q76FK4','Q9H8H2','Q6PJR7','P05787-2','A0A0C4DH19'};另外,您之前所做的是创建一个长字符串,因为字符串连接,但这是Matlab如何对待“行”字符数组。
因此,总共有13个节点,是时候将边缘列表(源-目的地对)转换为邻接矩阵(或连接矩阵)了。首先,让我们用唯一的ID映射每个节点名称,您可以轻松地执行以下操作:
nodeIDs=unique([S,T]);
for i=1:length(nodeIDs)
mapTable{i,1}=i;
mapTable{i,2}=nodeIDs{i};
endmapTable将有以下形式:
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);

https://stackoverflow.com/questions/36740701
复制相似问题