Вдохновленный последним сообщением в блоге Кливом Молером, вы также можете использовать функцию 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);
Результат в этом случае:
Другие улучшения включают в себя замену прямых линий на изогнутые сплайны для рисования ребер (таким образом вы получите более приятный график, похожий на второй, который вы показали) или использование разных цветов для отображения кластеров вершин и их ребер (очевидно, вам нужно будет сделать кластеризацию графа). Я оставлю вам эти шаги:)