如何使用MATLAB绘制邻接矩阵图

Cha*_*ton 8 matlab graph-theory matrix octave adjacency-matrix

我想创建一个图表,显示来自邻接矩阵的节点之间的连接,如下所示.

在此输入图像描述

gplot似乎是最好的工具.但是,为了使用它,我需要传递每个节点的坐标.问题是我不知道坐标应该在哪里,我希望这个函数能够为我找出一个好的布局.

例如,这是我的输出使用以下任意坐标:

 A = [1 1 0 0 1 0;
      1 0 1 0 1 0;
      0 1 0 1 0 0;
      0 0 1 0 1 1;
      1 1 0 1 0 0;
      0 0 0 1 0 0];

 crd = [0 1;
        1 1;
        2 1;
        0 2;
        1 2;
        2 2];

 gplot (A, crd, "o-");
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这很难读,但是如果我稍微使用坐标并将它们更改为以下内容就会变得更具可读性.

   crd = [0.5 0;
         0 1;
         0 2;
         1 2;
         1 1;
         1.5 2.5];
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我不希望完美优化的坐标或任何东西,但我怎么能告诉MATLAB自动为我找出一组坐标看起来没问题使用某种算法,所以我可以绘制一些看起来像顶部图片的东西.

提前致谢.

Bas*_*els 5

一种方法是使用某种静电排斥来编写自己的算法,就像你链接的文章一样.可能可以在少于40行的Matlab中完成(似乎其他人已经尝试过).但有时,使用外部工具比在Matlab中完成所有工作更好.绘制图形的最佳工具可能是Graphviz,它附带了一套用于绘制不同样式图的工具.对于无向图,要使用的是neato.我不知道它用于分配节点的算法,但我想它与你论文中的算法类似(其中一个参考文献甚至提到了Graphviz!).

这些工具的输入是一种非常简单的文本格式,使用Matlab很容易生成.示例(这适用于Linux,您可能需要在Windows上稍微更改一下):

% adjacency matrix
A = [1 1 0 0 1 0;
     1 0 1 0 1 0;
     0 1 0 1 0 0;
     0 0 1 0 1 1;
     1 1 0 1 0 0;
     0 0 0 1 0 0];

% node labels, these must be unique
nodes = {'A', 'B', 'C', 'D', 'E', 'F'};

n = length(nodes);
assert(all(size(A) == n))

% generate dot file for neato
fid = fopen('test.dot', 'w');
fprintf(fid, 'graph G {\n');
for i = 1:n
    for j = i:n
        if A(i, j)
            fprintf(fid, '    %s -- %s;\n', nodes{i}, nodes{j});
        end
    end
end
fprintf(fid, '}\n');
fclose(fid);

% render dot file
system('neato -Tpng test.dot -o test.png')
Run Code Online (Sandbox Code Playgroud)

这产生文件test.dot:

graph G {
    A -- A;
    A -- B;
    A -- E;
    B -- C;
    B -- E;
    C -- D;
    D -- E;
    D -- F;
}
Run Code Online (Sandbox Code Playgroud)

最后是一个image test.png(注意你的邻接矩阵列出了第一个项目与自身的连接,它显示为节点A的循环):

在此输入图像描述

作为一个更复杂的例子,你可以在下面的文档中绘制一个巴基球gplot:

[A, XY] = bucky;
nodes = arrayfun(@(i) num2str(i), 1:size(A,1), 'uni', 0);
Run Code Online (Sandbox Code Playgroud)

结果(注意布局是由neato完成的,它不使用XY):

在此输入图像描述


KQS*_*KQS 5

从R2015b开始,MATLAB现在拥有一套图形和网络算法.对于此示例,您可以创建一个无向图形对象,然后使用重载plot函数绘制它:

% Create symmetric adjacency matrix
A = [1 1 0 0 1 0;
     1 0 1 0 1 0;
     0 1 0 1 0 0;
     0 0 1 0 1 1;
     1 1 0 1 0 0;
     0 0 0 1 0 0];
% Create undirected graph object
G = graph(A);
% Plot
plot(G);
Run Code Online (Sandbox Code Playgroud)

使用MATLAB的图形/绘图功能创建的布局