使用节点之间的链接绘制圆形节点的网络

时间:2011-04-27 12:56:31

标签: matlab graph plot graph-theory graph-visualization

我想画一个节点的圆形图,其中某些节点之间有链接。以下是社交网络图表中的一些示例:

example1 http://wrightresult.com/wp-content/uploads/social-network-circle5-lg.jpg

example2

example3 http://twit88.com/blog/wp-content/uploads/2008/07/windowslivewriterjung-ed84jung-2.jpg

如何用MATLAB完成?是否可以不安装单独的包?

2 个答案:

答案 0 :(得分:13)

这是你可以做你想做的一种方式。首先,在您感兴趣的圆上生成点

clear;
theta=linspace(0,2*pi,31);theta=theta(1:end-1);
[x,y]=pol2cart(theta,1);

接下来,如果您知道已连接的节点对,则可以跳过此步骤。但在许多情况下,您从其他计算中获得连接矩阵,并从中找到连接节点的索引。在这里,我创建了一个布尔连接矩阵。因此,如果有N个节点,则连接矩阵是NxN对称矩阵,如果i,j元素是1,则表示您从节点连接{}为} i到节点j0。然后,您可以提取非零对的下标以获取节点连接(仅需要上三角形)。

links=triu(round(rand(length(theta))));%# this is a random list of connections
[ind1,ind2]=ind2sub(size(links),find(links(:)));

这是我用上面的代码生成的连接矩阵。

enter image description here

现在我们只需要一次一个地绘制连接

h=figure(1);clf(h);
plot(x,y,'.k','markersize',20);hold on
arrayfun(@(p,q)line([x(p),x(q)],[y(p),y(q)]),ind1,ind2);
axis equal off

会给你一个类似于你的例子的数字

enter image description here

答案 1 :(得分:5)

受到Cleve Moler最新blog post的启发,您还可以使用gplot函数绘制给定邻接矩阵和节点坐标的图形。

以下是使用bucky的示例; MATLAB的演示函数部分,生成截断的二十面体(看起来像一个足球)的图形。在这个例子中我们只使用它的邻接矩阵,因为我们将顶点布置成圆形:

%# 60-by-60 sparse adjacency matrix
A = bucky();
N = length(A);

%# x/y coordinates of nodes in a circular layout
r =  1;
theta = linspace(0,2*pi,N+1)'; theta(end) = [];
xy = r .* [cos(theta) sin(theta)];

%# labels of nodes
txt = cellstr(num2str((1:N)','%02d'));

%# show nodes and edges
line(xy(:,1), xy(:,2), 'LineStyle','none', ...
    'Marker','.', 'MarkerSize',15, 'Color','g')
hold on
gplot(A, xy, 'b-')
axis([-1 1 -1 1]); axis equal off
hold off

%# show node labels
h = text(xy(:,1).*1.05, xy(:,2).*1.05, txt, 'FontSize',8);
set(h, {'Rotation'},num2cell(theta*180/pi))

circular_graph


我们可以更进一步,尽量减少边缘交叉。也就是说,我们想要重新排列节点,使边缘尽可能接近圆周。

这可以通过找到矩阵的对称permutation来实现,该矩阵最小化其带宽(非零更接近对角线)

matrix_permutation

p = symrcm(A);
A = A(p,p);
txt = txt(p);

在这种情况下的结果:

circular_graph_permutation

其他改进包括用曲线样条替换直线来绘制边缘(这样你得到一个类似于你所展示的第二个的更好的图形),或使用不同的颜色来显示顶点及其边缘的簇(显然你需要做图形聚类)。我将把这些步骤留给你:)