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

StackOverflow https://stackoverflow.com/questions/5804468

Вопрос

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

example1
(источник: wrightresult.com)

example2

example3
(источник: twit88.com)

Как это можно сделать с Matlab? Возможно ли это без установки отдельного пакета?

Это было полезно?

Решение

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

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

Далее, если вы знаете пары узлов, которые подключены, вы можете пропустить этот шаг. Но во многих случаях вы получаете матрицу подключения от других вычислений, и вы обнаружите индексы подключенных узлов из этого. Здесь я создал логическую матрицу соединений. Итак, если есть N узлы, матрица подключения является NxN симметричная матрица, где, если i,jЭлемент есть 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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top