4

私は NetworkX で有向グラフのコードに取り組んでおり、プログラミング経験が疑わしい結果である可能性が高いブロックにぶつかりました。私がやろうとしていることは次のとおりです。

有向グラフ G があり、上部に 2 つの「親ノード」があり、そこから他のすべてのノードが流れます。このネットワークをグラフ化するとき、「親 1」の子孫であるすべてのノードをある色でグラフ化し、他のすべてのノードを別の色でグラフ化したいと思います。つまり、親 1 の後継者のリストが必要です。

現在、次を使用してそれらの最初のレイヤーを簡単に取得できます。

descend= G.successors(parent1)

問題は、これが私に後継者の第 1 世代しか与えないことです。できれば、後継者の後継者、後継者の後継者などを希望します。任意に、何世代が含まれているかを正確に知らなくても分析を実行してグラフを作成できると非常に便利だからです。 .

これにアプローチする方法はありますか?

4

7 に答える 7

6

子孫のリストは必要ありません。色を付けたいだけです。そのためには、グラフをトラバースするアルゴリズムを選択し、それを使用してエッジに色を付けるだけです。

たとえば、次のことができます。

from networkx.algorithms.traversal.depth_first_search import dfs_edges

G = DiGraph( ... )
for edge in dfs_edges(G, parent1):
    color(edge)

https://networkx.github.io/documentation/stable/reference/algorithms/generated/networkx.algorithms.traversal.depth_first_search.dfs_edges.html?highlight=traversalを参照してください。

于 2011-07-31T01:10:57.623 に答える
1

答えがややクリーンで、それに出くわした将来の人々が見つけやすいように、私が最終的に使用したコードは次のとおりです。

G = DiGraph() # Creates an empty directed graph G
infile = open(sys.argv[1])
for edge in infile:
    edge1, edge2 = edge.split() #Splits data on the space
    node1 = int(edge1) #Creates integer version of the node names 
    node2 = int(edge2)
    G.add_edge(node1,node2) #Adds an edge between two nodes

parent1=int(sys.argv[2])   
parent2=int(sys.argv[3])

data_successors = dfs_successors(G,parent1)
successor_list = data_successors.values()
allsuccessors = [item for sublist in successor_list for item in sublist]

pos = graphviz_layout(G,prog='dot') 
plt.figure(dpi=300)
draw_networkx_nodes(G,pos,node_color="LightCoral")
draw_networkx_nodes(G,pos,nodelist=allsuccessors, node_color="SkyBlue")
draw_networkx_edges(G,pos,arrows=False) 
draw_networkx_labels(G,pos,font_size=6,font_family='sans-serif',labels=labels)
于 2011-07-31T19:05:30.673 に答える