abc*_*bcd 13

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

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

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

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

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

在此输入图像描述

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

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
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

  • 很好,但你不需要拨打[ARRAYFUN](http://www.mathworks.com/help/techdoc/ref/arrayfun.html).如果输入X和Y数据的矩阵,则可以使用[PLOT](http://www.mathworks.com/help/techdoc/ref/plot.html)和[LINE](http://www.mathworks. com/help/techdoc/ref/line.html)将自动为每列绘制一行.所以你可以像这样绘制连接:`plot([x(ind1); x(ind2)],[y(ind1); y(ind2)],'b');` (3认同)
  • @gnovice:是的,我知道这一点.我使用`arrayfun`因为我不确定OP是否只是解除绘图命令并直接在他的程序中使用或者在这里遵循整个代码.如果他初始化了他的节点向量和连接索引作为我在这里的转置,并且刚刚使用了SO的绘图函数,那么使用`plot()`可能会产生一条连线,而不是一条直线每对,而`arrayfun`仍将成对配对.但是,是的,如果OP与他的向量一致,`plot()`就是要走的路. (2认同)

Amr*_*mro 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))
Run Code Online (Sandbox Code Playgroud)

circular_graph


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

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

matrix_permutation

p = symrcm(A);
A = A(p,p);
txt = txt(p);
Run Code Online (Sandbox Code Playgroud)

在这种情况下的结果:

circular_graph_permutation

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