2009-12-05 9 views
7

Chciałem wizualizować sieć z posiadanymi danymi i chciałbym je wyrysować przy określonych długościach krawędzi. Używam Pythona i próbowałem networkx i igraph, ale wszystkie wydają się przypisywać stałe długości krawędzi.Określone długości krawędzi w siecix/igraph (Python)

a.) Zastanawiam się, czy zrobiłem źle kody lub pakiety nie są naprawdę zdolne. Jak prawidłowo zaimplementować określone długości krawędzi dla networkx lub igraph?

b.) Jeśli siećx i igraph nie mogą tego zrobić, jaki pakiet mógłbyś zasugerować? (Najlepiej taki, który może przenosić ponad 80 tysięcy węzłów).

Dzięki!

+2

Ogólnie programy kreślenia w sieci/wykresie nie pozwalają na przypisanie stałych długości krawędzi, ponieważ nie wszystkie wykresy można narysować, jeśli również ustalisz długości krawędzi. Pomyśl o trójkącie o długości boku 1,1,100. Jeśli więc istnieje pakiet, nie będzie to ogólny pakiet kreślący wykres. Albo jest coś specjalnego na twoim wykresie, który to umożliwia, albo będziesz musiał sam go zaprogramować. – unutbu

Odpowiedz

5

ta powinna działać:

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

Większość algorytmów wykres rysunkowe pewną wersję SMACOF, które oczywiście różni się na długości krawędzi; jednak silnik układu graficznego "neato" (dostarczany jako drugi argument do "narysowania" powyżej) powinien zachować, jeśli w ogóle możliwe, ustawione przez użytkownika długości krawędzi.

Biblioteka, której tu użyłem, jest z pewnością wystarczająco wytrzymała, aby obsłużyć 80 000 węzłów.

Powiązane problemy