Рисование сети узлов в круговой формации со ссылками между узлами
Я хотел бы нарисовать круговой график узлов, где определенные узлы имеют связь между ними. Вот несколько примеров из графиков социальной сети:
example1 http://wrightresult.com/wp-content/uploads/social-network-circle5-lg.jpg
![example2]()
example3 http://twit88.com/blog/wp-content/uploads/2008/07/windowslivewriterjung-ed84jung-2.jpg
Как это можно сделать с MATLAB? Возможно ли это без установки отдельного пакета?
Ответы
Ответ 1
Вот один из способов сделать то, что вы хотите. Сначала создайте точки на интересующем вас круге
clear;
theta=linspace(0,2*pi,31);theta=theta(1:end-1);
[x,y]=pol2cart(theta,1);
Далее, если вы знаете пары подключенных узлов, вы можете пропустить этот шаг. Но во многих случаях вы получаете матрицу связности от других вычислений, и вы находите из нее индексы связанных узлов. Здесь я создал булевую матрицу соединений. Итак, если есть узлы N
, матрица связности является симметричной матрицей NxN
, где если i,j
-й элемент 1
, это означает, что у вас есть соединение от node i
до node j
и 0
в противном случае. Затем вы можете извлечь индексы ненулевых пар, чтобы получить соединения node (нужен только верхний треугольник).
links=triu(round(rand(length(theta))));%# this is a random list of connections
[ind1,ind2]=ind2sub(size(links),find(links(:)));
Это матрица связи I, сгенерированная с помощью кода выше.
![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]()
Ответ 2
Вдохновленный последним блога от Cleve Moler, вы также можете использовать gplot
для рисования графика с учетом матрицы смежности и координат node.
Вот пример, используя 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))
![circular_graph]()
Мы можем сделать это еще дальше и попытаться свести к минимуму пересечения кромок. То есть мы хотим переставить узлы так, чтобы края были как можно ближе к окружности круга.
Это можно сделать, если найти симметричную перестановку матрицы, которая минимизирует ее пропускную способность (не-нули ближе к диагонали)
![matrix_permutation]()
p = symrcm(A);
A = A(p,p);
txt = txt(p);
Результат в этом случае:
![circular_graph_permutation]()
Другие улучшения включают в себя замену прямых линий изогнутыми сплайнами для рисования краев (таким образом, вы получите более удобный граф, аналогичный второму, который вы показали) или используя разные цвета для отображения кластеров вершин и их краев (очевидно, вам понадобится кластер графов). Я оставлю эти шаги вам:)