Zeichnen eines Netzwerks von Knoten in kreisförmiger Bildung mit Verbindungen zwischen Knoten
-
24-10-2019 - |
Frage
Ich möchte einen kreisförmigen Graphen von Knoten zeichnen, in dem bestimmte Knoten eine Verbindung zwischen ihnen haben. Hier sind einige Beispiele aus sozialen Netzwerkgrafiken:
(Quelle: Wrightresult.com)
(Quelle: twit88.com)
Wie kann das mit MATLAB gemacht werden? Ist es möglich, ohne ein separates Paket zu installieren?
Lösung
Hier ist eine Möglichkeit, was Sie wollen, was Sie wollen. Erstellen Sie zunächst Punkte auf dem Kreis, an dem Sie interessiert sind
clear;
theta=linspace(0,2*pi,31);theta=theta(1:end-1);
[x,y]=pol2cart(theta,1);
Wenn Sie die angeschlossenen Knotenpaare kennen, können Sie diesen Schritt überspringen. In vielen Fällen erhalten Sie jedoch eine Konnektivitätsmatrix aus anderen Berechnungen und finden die Indizes der verbundenen Knoten daraus. Hier habe ich eine booleale Matrix von Verbindungen erstellt. Also, wenn es gibt N
Knoten, die Konnektivitätsmatrix ist eine NxN
symmetrische Matrix, wo wenn die i,j
Das Element ist 1
, Es bedeutet, dass Sie eine Verbindung vom Knoten haben i
zum Knoten j
und 0
Andernfalls. Sie können dann die Indexs der ungleich Null-Paare extrahieren, um Knotenverbindungen zu erhalten (nur das obere Dreieck wird benötigt).
links=triu(round(rand(length(theta))));%# this is a random list of connections
[ind1,ind2]=ind2sub(size(links),find(links(:)));
Dies ist die Konnektivitätsmatrix, die ich mit dem obigen Code generiert habe.
Jetzt müssen wir nur die Verbindungen nacheinander zeichnen
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
Dies gibt Ihnen eine ähnliche Figur wie Ihre Beispiele
Andere Tipps
Inspiriert vom neuesten Blogeintrag Mit Cleve Moler können Sie auch die verwenden gplot
Funktion zum Zeichnen eines Diagramms mit einer Adjazenzmatrix und Knotenkoordinaten.
Hier ist ein Beispiel verwendet bucky
; Eine Demo -Funktion von MATLAB, die die Grafik eines verkürzten ICOSADHEDRON erzeugt (sieht aus wie ein Fußball). Wir werden nur die Adjazenzmatrix für dieses Beispiel verwenden, da wir die Eckpunkte in kreisförmiger Form auslegen:
%# 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))
Wir können dies noch einen Schritt weiter gehen und versuchen, die Kantenübergänge zu minimieren. Das ist, dass wir die Knoten neu ordnen, damit die Kanten so nah wie möglich am Umfang des Kreises sind.
Dies kann durch die Suche nach einem symmetrischen Finden erfolgen Permutation der Matrix, die ihre Bandbreite minimiert (Nicht-Ziers sind näher an der Diagonale)
p = symrcm(A);
A = A(p,p);
txt = txt(p);
Das Ergebnis in diesem Fall:
Weitere Verbesserungen sind das Ersetzen von geraden Linien durch gekrümmte Splines zum Zeichnen der Kanten (auf diese Weise erhalten Sie ein schöneres Diagramm, das dem zweiten ähnlich ist), oder verwenden Sie verschiedene Farben, um Cluster von Scheitelpunkten und deren Kanten anzuzeigen (offensichtlich Sie werden (offensichtlich Sie Müssen Grafik -Clustering ausführen). Ich werde dir diese Schritte überlassen :)