13

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

示例1
(来源:wrightresult.com

示例2

示例3
(来源:twit88.com

MATLAB如何做到这一点?是否可以不安装单独的软件包?

4

2 回答 2

13

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

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

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

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

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

在此处输入图像描述

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

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

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

在此处输入图像描述

于 2011-04-27T14:54:27.570 回答
5

受Cleve Moler最新博客文章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))

圆形图


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

这可以通过找到最小化其带宽的矩阵的对称排列来完成(非零更接近对角线)

矩阵排列

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

这种情况下的结果:

圆形图排列

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

于 2013-06-13T18:30:21.040 回答