2014-09-03 6 views
8

sono riuscito a produrre correttamente il grafico, ma con alcuni ulteriori test notato risultato incoerente consultato due diverse serie di codici:NetworkX - cambiamento di colore/larghezza secondo attributi bordo - risultato incoerente

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

La prima la riga produce risultati coerenti, mentre la seconda produce colori/dimensioni errati per gli ordini di spigoli.

Tuttavia, mi sembra che le due righe precedenti si basino entrambe sulla chiamata di funzione per restituire gli attributi per l'ordine dei bordi. Perché i diversi risultati?

Mi sembra un po 'goffo accedere agli attributi con h[][][]; è possibile accedervi per convenzione di punti, ad es. edge.color for edge in h.edges().

Oppure mi sono perso qualcosa?

risposta

13

L'ordine dei bordi passati alle funzioni di disegno è importante. Se non si specifica (utilizzando la parola chiave edges) verrà visualizzato l'ordine predefinito di G.edges(). E 'più sicuro per dare modo esplicito il parametro in questo modo:

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) 

Ciò si traduce in un output come questo: enter image description here

+0

tkyou! il tuo codice è praticamente lo stesso della mia prima linea di codici. ma, intendi la funzione get_edges_attributes non restituirebbe i bordi in ordine come quello di edges()? – timeislove