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.
2 réponses
graphvizneato
essaie 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
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 )