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 )

Example2


(source: twit88.com )

Comment cela peut-il être fait avec Matlab? Est-il possible sans installer un paquet séparé?

Était-ce utile?

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

entrer image description ici

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

entrer image description ici

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.

Voici un exemple en utilisant


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)

matrix_permutation

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

Le résultat dans ce cas:

circular_graph_permutation

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top