2014-09-03 11 views
8

udało się wytworzyć wykres poprawnie, ale z dalszych testów zauważyć wynik niezgodny z następującego dwóch różnych linii kody:NetworkX - zmiana barwy/szerokość według cech krawędzi - sprzeczny wynik

nx.draw_circular(h,edge_color=[h.edge[i][j]['color'] for (i,j) in h.edges_iter()], width=[h.edge[i][j]['width'] for (i,j) in h.edges_iter()]) 

nx.draw_circular(h,edge_color=list(nx.get_edge_attributes(h,'color').values()), width=list(nx.get_edge_attributes(h,'width').values())) 

Pierwszy wyniki wierszy są spójne, podczas gdy drugie dają zły kolor/rozmiar na zamówienie krawędzi.

Jednak wygląda na to, że powyższe dwie linie opierają się na wywołaniu funkcji, aby zwrócić atrybuty według kolejności krawędzi. Dlaczego różne wyniki?

Wygląda trochę nieporadnie, aby uzyskać dostęp do atrybutów z h[][][]; czy można uzyskać do niego dostęp poprzez konwencję kropkową, np. edge.color for edge in h.edges().

Czy coś mi umknęło?

Odpowiedz

13

Kolejność krawędzi przekazywanych do funkcji rysowania jest ważna. Jeśli nie określisz (używając słowa kluczowego krawędzi), otrzymasz domyślną kolejność G.edges(). Najbezpieczniej jest wyraźnie dać parametr tak:

import networkx as nx 

G = nx.Graph() 
G.add_edge(1,2,color='r',weight=2) 
G.add_edge(2,3,color='b',weight=4) 
G.add_edge(3,4,color='g',weight=6) 

pos = nx.circular_layout(G) 

edges = G.edges() 
colors = [G[u][v]['color'] for u,v in edges] 
weights = [G[u][v]['weight'] for u,v in edges] 

nx.draw(G, pos, edges=edges, edge_color=colors, width=weights) 

Powoduje wyjście tak: enter image description here

+0

tkyou! twój kod jest w zasadzie taki sam jak mój pierwszy wiersz kodów. ale masz na myśli, że funkcja get_edges_attributes nie zwróci krawędzi w kolejności, w jakiej występują krawędzie()? – timeislove

Powiązane problemy