2009-12-05 8 views
7

Ich wollte ein Netzwerk mit den Daten visualisieren, die ich habe, und sie mit bestimmten Kantenlängen darstellen. Ich benutze Python, und ich habe networkx und igraph zum plotten versucht, aber alle scheinen feste Kantenlängen zuzuweisen.Angegebene Kantenlängen im Netzwerk x/igraph (Python)

a.) Ich frage mich, ob ich die Codes falsch gemacht habe oder die Pakete nicht wirklich fähig sind. Wie werden vorgegebene Kantenlängen für networkx oder igraph korrekt umgesetzt?

b.) Wenn networkx und igraph nicht können, welches Paket könnten Sie vorschlagen? (Vorzugsweise eine, die über 80.000 Knoten tragen kann.)

Vielen Dank!

+2

Im Allgemeinen erlauben das Zeichnen von Netzwerk-/Grafikprogrammen keine festen Kantenlängen, da nicht alle Graphen geplottet werden können, wenn Sie auch die Kantenlängen festlegen. Stellen Sie sich ein Dreieck mit Seitenlängen von 1,1,100 vor. Wenn also ein Paket vorhanden ist, handelt es sich nicht um ein allgemeines Plotpaket. Entweder gibt es etwas Besonderes an Ihrem Diagramm, das es möglich macht, oder Sie müssen es selbst programmieren. – unutbu

Antwort

5

Dies sollte funktionieren:

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

Die meisten Zeichnen von Graphen-Algorithmen eine Version von SMACOF verwenden, was natürlich die Kantenlänge variiert; Die Graphviz-Layout-Engine 'neato' (die als zweites Argument für 'draw' angegeben wird) sollte jedoch, wenn immer möglich, benutzerdefinierte Kantenlängen beibehalten.

Die Bibliothek, die ich hier verwendet, ist sicherlich robust genug, um 80.000 Knoten zu behandeln.