Подтвердить что ты не робот

Рисование сети узлов в круговой формации со ссылками между узлами

Я хотел бы нарисовать круговой график узлов, где определенные узлы имеют связь между ними. Вот несколько примеров из графиков социальной сети:

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? Возможно ли это без установки отдельного пакета?

4b9b3361

Ответ 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

Другие улучшения включают в себя замену прямых линий изогнутыми сплайнами для рисования краев (таким образом, вы получите более удобный граф, аналогичный второму, который вы показали) или используя разные цвета для отображения кластеров вершин и их краев (очевидно, вам понадобится кластер графов). Я оставлю эти шаги вам:)