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

example1
(资源: wrightresult.com)

example2

example3
(资源: twit88.com)

MATLAB如何完成?如果不安装单独的软件包,是否可以使用?

有帮助吗?

解决方案

这是您可以做自己想做的一种方法。首先,在您感兴趣的圈子上生成点

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

其他提示

受到最新的启发 博客文章 由克莱夫·莫勒(Cleve Moler),您也可以使用 gplot 绘制给定邻接矩阵和节点坐标的函数。

这是使用的示例 bucky; MATLAB的演示功能部分,生成截短的Icosahedron的图(看起来像足球)。我们仅在此示例中使用其邻接矩阵,因为我们以圆形形状列出顶点:

%# 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


我们可以进一步迈出一步,并尝试最大程度地减少边缘交叉口。那就是我们要重新排列节点,以便边缘尽可能靠近圆的圆周。

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

matrix_permutation

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

在这种情况下的结果:

circular_graph_permutation

其他改进包括用曲线替换直线以绘制边缘(这样您获得了与您所显示的第二个相似的图表),或使用不同的颜色显示顶点及其边缘(显然您会您会您的)需要进行图形群集)。我会把这些步骤留给你:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top