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