web-dev-qa-db-ja.com

networkx-Edge属性に従って色/幅を変更-一貫性のない結果

私はグラフを正しく作成できましたが、さらにいくつかのテストで、次の2つの異なるコード行で一貫性のない結果が示されました。

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

1行目は一貫した出力を生成し、2行目はエッジの順序ごとに間違った色/サイズを生成します。

ただし、上記の2行はどちらも関数呼び出しに依存して、エッジの順序ごとに属性を返すように見えます。なぜ異なる結果になるのですか?

_h[][][]_で属性にアクセスするのは少し不器用に見えます。ドット表記でアクセスできますか? Edge.color for Edge in h.edges()

または私は何かを見逃しましたか?

28
timeislove

描画関数に渡されるエッジの順序は重要です。 (edgesキーワードを使用して)指定しない場合、G.edges()のデフォルトの順序が取得されます。次のようなパラメータを明示的に指定するのが最も安全です。

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)

これにより、次のような出力が生成されます。 enter image description here

46
Aric