Dessiner un graphique ou un réseau à partir d'une matrice de distance?

j'essaie de tracer/dessiner (matplotlib ou autre bibliothèque python) un réseau 2D d'une matrice de grandes distances où les distances seraient les bords du réseau esquissé et la ligne et la colonne ses noeuds.

DistMatrix =
[       'a',   'b',     'c',    'd'],
['a',   0,      0.3,    0.4,    0.7],
['b',   0.3,    0,      0.9,    0.2],
['c',   0.4,    0.9,    0,      0.1],
['d',   0.7,    0.2,    0.1,    0] ]

je cherche à dessiner/tracer le réseau 2d à partir d'une matrice de distance telle (plus grande: des milliers de colonnes et de lignes): le noeud 'a' est lié au noeud 'b' par une profondeur de bord de 0.3, les noeuds 'c' et 'd' seraient liés par une profondeur de bord de 0.1. Quels sont les outils/bibliothèques que je peux utilisé (la matrice de distance peut être convertie en matrice numpy) pour obtenir le croquis / projection graphique d'un tel réseau? (pandas, matplotlib, igraph,...?) et des pistes pour le faire rapidement (je ne voudrais pas définir mon auto Tkinter fonction pour le faire ;-) ) ? merci pour les réponses.

16
demandé sur sol 2012-11-22 17:11:18

2 réponses

graphvizneatoessaie respecter les longueurs des arêtes. doug montre une façon à harnacher neato en utilisant networkx comme ceci:

import networkx as nx
import numpy as np
import string

dt = [('len', float)]
A = np.array([(0, 0.3, 0.4, 0.7),
               (0.3, 0, 0.9, 0.2),
               (0.4, 0.9, 0, 0.1),
               (0.7, 0.2, 0.1, 0)
               ])*10
A = A.view(dt)

G = nx.from_numpy_matrix(A)
G = nx.relabel_nodes(G, dict(zip(range(len(G.nodes())),string.ascii_uppercase)))    

G = nx.drawing.nx_agraph.to_agraph(G)

G.node_attr.update(color="red", style="filled")
G.edge_attr.update(color="blue", width="2.0")

G.draw('/tmp/out.png', format='png', prog='neato')

les rendements

enter image description here

24
répondu unutbu 2017-05-23 11:48:18

vous pouvez utiliser le paquet networkx, qui fonctionne parfaitement avec ce genre de problèmes. Ajustez votre matrice pour supprimer un simple tableau de numpy comme ceci:

DistMatrix =array([[0,      0.3,    0.4,    0.7],
[0.3,    0,      0.9,    0.2],
[0.4,    0.9,    0,      0.1],
[0.7,    0.2,    0.1,    0] ])

puis importer networkx et l'utiliser

import networkx as nx
G = G=nx.from_numpy_matrix(DistMatrix)
nx.draw(G)

si vous voulez une version pondérée du graphique, vous devez spécifier la couleur de chaque bord (au moins, je ne pouvais pas trouver un moyen automatisé pour le faire):

nx.draw(G,edge_color = [ i[2]['weight'] for i in G.edges(data=True) ], edge_cmap=cm.winter )
15
répondu EnricoGiampieri 2012-11-22 13:41:25