6

次のコードを変更して、Child_4 を Grandchild_0 と同じ水平レベルに配置する (それにより、Grandchild_4 を独自のレベルにプッシュする) ことは可能ですか?

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_node("ROOT")
for i in xrange(5):
    G.add_node("Child_%i" % i)
    G.add_node("Grandchild_%i" % i)
    G.add_edge("ROOT", "Child_%i" % i)
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i)

pos=nx.graphviz_layout(G,prog='dot')
nx.draw(G,pos,arrows=False)
plt.show()

上記のコードは次のレイアウトを生成します。これを変更して、子を 1 レベル下に移動して孫と水平に揃えます。 img は、ルート ノード、5 つの子、および各子の下に 1 つの孫を示しています。


Python ネットワーク ライブラリ networkx 内で、graphviz のドット エンジンを使用してツリーをレンダリングしています (この推奨事項に従っています)。どのノードを同じ高さにするかを指定して、ノードの y 位置を制御したいと思います。ノードは、ツリー内の異なる深さにある場合があります。

コマンドを使用して独自のgraphvizコードを記述した場合、ノードの高さを制御できることはわかっていますrank=same(例:{rank=same; n4 -> p2;}[])。ただし、私は networkx.graphviz_layout() [ doc |に依存しています。source ] を使用してノードの位置を生成し、graphviz_layout はコマンド ライン引数のみを pygraphviz に送信できます。のバリアントを使用しようとしてnx.graphviz_layout(G, prog='dot', args="-Grank=same; n4 -> p2;")失敗しました。 pygraphviz の NetworkX ラッパー内で目的のノードの高さを記述することは可能ですか、それとも pygraphviz の周りに独自のラッパーを作成する必要がありますか? 編集:答えは、pygraphviz の新しいラッパーを提供します。pygraphviz の既存の NetworkX ラッパー内でランク情報を送信すると、物事が大幅に簡素化されます。誰かがそれがどのように可能かを教えてくれれば、受け入れられた答えを変更します。

4

1 に答える 1

4

元の networkx ラッパーでこれを実現する方法が見つかりません。

代わりに、ソース コードからほとんどの行をコピーして、pygraphviz の新しいラッパーを作成しました。sameRank = []同じランクのノードのリストのパラメーターとfor、呼び出しのループを追加しますpygraphviz.add_subgraph(listOfNodes,rank="same")

def graphviz_layout_with_rank(G, prog = "neato", root = None, sameRank = [], args = ""):
    ## See original import of pygraphviz in try-except block
    ## See original identification of root through command line
    A = nx.to_agraph(G)
    for sameNodeHeight in sameRank:
        if type(sameNodeHeight) == str:
            print("node \"%s\" has no peers in its rank group" %sameNodeHeight)
        A.add_subgraph(sameNodeHeight, rank="same")
    A.layout(prog=prog, args=args)
    ## See original saving of each node location to node_pos 
    return node_pos

質問の例では、Child_4 を Grandchild_0 と同じ水平レベルにプッシュできます。

pos=graphviz_layout_with_rank(G, prog='dot',sameRank=[["Child_4","Grandchild_0"]])
于 2013-03-15T04:15:26.707 に答える