2009-12-05 25 views
7

Je voulais visualiser un réseau avec les données dont je dispose et je voudrais les représenter graphiquement avec des longueurs d'arêtes spécifiques. J'utilise Python, et j'ai essayé networkx et igraph pour tracer, mais tous semblent assigner des longueurs d'arêtes fixes. A.) Je me demande si j'ai mal fait les codes ou si les paquets ne sont pas vraiment capables. Comment implémentez-vous correctement les longueurs d'arêtes spécifiées pour networkx ou igraph? B)) Si networkx et igraph ne peuvent pas le faire, quel paquet pourriez-vous suggérer? (De préférence un qui peut transporter plus de 80 mille nœuds.)Longueurs d'arêtes spécifiées sur networkx/igraph (Python)

Merci!

+2

En général, les programmes de traçage réseau/graphique ne vous permettront pas d'assigner des longueurs d'arêtes fixes car tous les graphes ne peuvent pas être tracés si vous fixez également les longueurs d'arêtes. Pensez à un triangle avec des longueurs de côté de 1,1,100. Donc, s'il y a un paquet, ce ne sera pas un paquet graphique général. Soit il y a quelque chose de spécial dans votre graphique qui le rend possible, soit vous devrez le programmer vous-même. – unutbu

Répondre

5

Cela devrait fonctionner:

import networkx as NX 
import pygraphviz as PG 

G = PG.AGraph() 
nlist = "A B C D E".split() 
a, b = "A A B", "B C D" 
elist = zip(a.split(), b.split()) 

G.add_nodes_from(nlist) 
G.add_edges_from(elist) 
G.node_attr.update(color="red", style="filled") 
G.edge_attr.update(color="blue", len="2.0", width="2.0") 

print(G.edge_attr) 
# returns {'color': 'red', 'width': '', 'len': '2.0'} 

# add new edge with custom length (all others have length=2.0): 
G.add_edge("C", "E", len="3.0", color="blue", width="2.0") 

edge = G.get_edge("C", "E") 
print(edge_attr) 
# returns {'color': 'blue', 'width': '2.0', 'len': '3.0'} 

# and you can confirm that introspection by drawing & printing this graph: 
G.draw('somefolderandfilename.png', format='png', prog='neato') 

La plupart des algorithmes de dessin graphique utilisent une version de SMACOF, ce qui bien sûr fait varier la longueur du bord; cependant, le moteur de mise en page graphviz 'neato' (fourni en tant que 2ème argument pour 'dessiner' ci-dessus) devrait préserver, si possible, les longueurs d'arêtes définies par l'utilisateur.

La bibliothèque que j'ai utilisée ici est certainement assez robuste pour gérer 80 000 nœuds.