次のコードを変更して、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 レベル下に移動して孫と水平に揃えます。
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 ラッパー内でランク情報を送信すると、物事が大幅に簡素化されます。誰かがそれがどのように可能かを教えてくれれば、受け入れられた答えを変更します。