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:

example1
(Quelle: Wrightresult.com)

example2

example3
(Quelle: twit88.com)

Wie kann das mit MATLAB gemacht werden? Ist es möglich, ohne ein separates Paket zu installieren?

War es hilfreich?

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,jDas 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.

enter image description here

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

enter image description here

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))

circular_graph


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)

matrix_permutation

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

Das Ergebnis in diesem Fall:

circular_graph_permutation

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 :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top