我想绘制一个节点的圆形图,其中某些节点之间有链接。以下是来自社交网络图的一些示例:
(来源:wrightresult.com)
(来源:twit88.com)
MATLAB如何做到这一点?是否可以不安装单独的软件包?
我想绘制一个节点的圆形图,其中某些节点之间有链接。以下是来自社交网络图的一些示例:
(来源:wrightresult.com)
(来源:twit88.com)
MATLAB如何做到这一点?是否可以不安装单独的软件包?
这是您可以做您想做的事情的一种方法。首先,在你感兴趣的圆圈上生成点
clear;
theta=linspace(0,2*pi,31);theta=theta(1:end-1);
[x,y]=pol2cart(theta,1);
接下来,如果您知道连接的节点对,则可以跳过此步骤。但在许多情况下,您会从其他计算中获得连接矩阵,并从中找到连接节点的索引。在这里,我创建了一个布尔连接矩阵。因此,如果有N
节点,则连接矩阵是一个NxN
对称矩阵,如果第i,j
th 个元素是1
,则意味着您有一个从节点i
到节点的连接j
,0
否则。然后,您可以提取非零对的下标以获取节点连接(仅需要上三角形)。
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
这会给你一个类似于你的例子的数字
受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);
这种情况下的结果:
其他改进包括用曲线样条代替直线来绘制边缘,(这样你会得到一个更好的图表,类似于你展示的第二个图表),或者使用不同的颜色来显示顶点簇及其边缘(显然你会需要做图聚类)。我会把这些步骤留给你:)