web-dev-qa-db-fra.com

networkx - changer la couleur / largeur selon les attributs Edge - résultat incohérent

J'ai réussi à produire le graphique correctement, mais avec d'autres tests, un résultat incohérent a été noté pour les deux lignes de codes différentes suivantes:

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 première ligne produit une sortie cohérente, tandis que la seconde produit une couleur/taille incorrecte selon les ordres des bords.

Cependant, il me semble que les deux lignes ci-dessus s'appuient toutes deux sur l'appel de fonction pour renvoyer les attributs selon l'ordre des bords. Pourquoi les différents résultats?

Cela me semble un peu maladroit d'accéder aux attributs avec h[][][]; est-il possible d'y accéder par convention de points, par ex. Edge.color for Edge in h.edges().

Ou ai-je raté quelque chose?

28
timeislove

L'ordre des bords transmis aux fonctions de dessin est important. Si vous ne spécifiez pas (en utilisant le mot-clé bords), vous obtiendrez l'ordre par défaut de G.edges (). Il est plus sûr de donner explicitement le paramètre comme ceci:

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)

Il en résulte une sortie comme celle-ci: enter image description here

46
Aric