Dessin d'un réseau de noeuds dans la formation circulaire avec des liens entre les noeuds
-
24-10-2019 - |
Question
Je voudrais dessiner un graphique circulaire de noeuds où certains noeuds ont un lien entre eux. Voici quelques exemples de graphes de réseaux sociaux:
(source: wrightresult.com )
(source: twit88.com )
Comment cela peut-il être fait avec Matlab? Est-il possible sans installer un paquet séparé?
La solution
Voici une façon que vous pouvez faire ce que vous voulez. Tout d'abord, générer des points sur le cercle que vous êtes intéressé à
clear;
theta=linspace(0,2*pi,31);theta=theta(1:end-1);
[x,y]=pol2cart(theta,1);
Ensuite, si vous connaissez les paires de noeuds qui sont connectés, vous pouvez sauter cette étape. Mais dans de nombreux cas, vous obtenez une matrice de connectivité d'autres calculs, et vous trouverez les indices des noeuds connectés de cela. Ici, j'ai créé une matrice booléenne de connexions. Ainsi, s'il y a des noeuds N
, la matrice de connectivité est une matrice symétrique NxN
, où, si l'élément est i,j
th 1
, cela signifie que vous avez une connexion à partir du noeud à noeud i
j
et 0
autrement. Vous pouvez ensuite extraire les paires des indices non nuls pour obtenir des connexions de nœud (seul le triangle supérieur est nécessaire).
links=triu(round(rand(length(theta))));%# this is a random list of connections
[ind1,ind2]=ind2sub(size(links),find(links(:)));
Ceci est la matrice de connectivité I généré avec le code ci-dessus.
Maintenant, nous devons tracer les connexions, un à la fois
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
qui vous donnera un chiffre similaire à vos exemples
Autres conseils
Inspiré par le dernier message par Cleve Moler, vous pouvez également utiliser la fonction gplot
pour dessiner une graphique donné une matrice d'adjacence et les coordonnées noeud.
Nous pouvons prendre un peu plus loin et essayer de minimiser les passages de bord. Ce que nous voulons réorganiser les nœuds afin que les bords soient aussi proches que possible de la circonférence du cercle.
Cela peut être fait en trouvant un symétrique permutation de la matrice qui minimise sa bande passante (non-zéros sont plus proches de la diagonale)
p = symrcm(A);
A = A(p,p);
txt = txt(p);
Le résultat dans ce cas:
D'autres améliorations comprennent le remplacement des lignes droites avec des cannelures courbes pour dessiner les bords, (cette façon, vous obtenez un graphique plus agréable similaire à la seconde que vous avez montré), ou en utilisant des couleurs différentes pour montrer des grappes de sommets et de leurs bords (évidemment vous aurez besoin de faire le regroupement graphique). Je laisserai ces étapes pour vous:)