Рисование сети узлов в круговом образовании со связями между узлами - PullRequest
13 голосов
/ 27 апреля 2011

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

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

Ответы [ 2 ]

13 голосов
/ 27 апреля 2011

Вот один из способов сделать то, что вы хотите. Сначала создайте точки на интересующем вас круге

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

Далее, если вы знаете пары узлов, которые подключены, вы можете пропустить этот шаг. Но во многих случаях вы получаете матрицу связности из других вычислений, и по ней вы находите индексы подключенных узлов. Здесь я создал булеву матрицу соединений. Таким образом, если имеется N узлов, матрица связности представляет собой NxN симметричную матрицу, где, если i,j th элемент равен 1, это означает, что у вас есть соединение от узла i к узлу j и 0 в противном случае. Затем можно извлечь индексы ненулевых пар, чтобы получить соединения узлов (необходим только верхний треугольник).

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

Это матрица связности, которую я сгенерировал с помощью кода выше.

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

5 голосов
/ 13 июня 2013

Вдохновленный последним сообщением в блоге Кливом Молером, вы также можете использовать функцию 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))

circular_graph


Мы можем пойти дальше и попытаться свести к минимуму пересечения краев. То есть мы хотим переставить узлы так, чтобы края были как можно ближе к окружности круга.

Это можно сделать, найдя симметричную перестановку матрицы, которая минимизирует ее пропускную способность (ненулевые значения ближе к диагонали)

matrix_permutation

p = symrcm(A);
A = A(p,p);
txt = txt(p);

Результат в этом случае:

circular_graph_permutation

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

...