2012-07-13 3 views
45

私はツリー構造のフロー図を作成しようとしています。私はnetworkxで代表的なグラフを作成することができましたが、プロットを出力するときにツリー構造を表示する方法が必要です。私はグラフをプロットするためにmatplotlib.pylabを使用しています。NetworkXからの階層出力を保証する手段はありますか?

データは、hereのような構造で表示する必要があります。私はサブグラフを持っていませんが。

どうすればそのような構造を保証できますか?不信者のための

例:

Various NetworkX layouts

私はpylabとgraphvizのとグラフを表示することができましたが、どちらもオファーがツリー構造私が探しています。私はxが提供しなければならないすべてのレイアウトネットワークを試しましたが、それらのどれも階層を示していません。私はちょうど私がウエイトを使用する必要がある場合オプション/モードまたはを与えるにはわからない。どんな提案も束に役立ちます。

@jterrace:

ここで私は上記のプロットを生成するために使用するものの大まかな概要です。いくつかのラベルを追加しましたが、それ以外は同じです。

import networkx as nx 
import matplotlib.pyplot as plt 
G = nx.Graph() 

G.add_node("ROOT") 

for i in xrange(5): 
    G.add_node("Child_%i" % i) 
    G.add_node("Grandchild_%i" % i) 
    G.add_node("Greatgrandchild_%i" % i) 

    G.add_edge("ROOT", "Child_%i" % i) 
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i) 
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) 

plt.title("draw_networkx") 
nx.draw_networkx(G) 

plt.show() 

答えて

64

有向グラフを使用している場合、Graphvizのドットレイアウトはツリーのように機能します。ここでいくつかのコードは、ここで

を更新し

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_node("Greatgrandchild_%i" % i) 

    G.add_edge("ROOT", "Child_%i" % i) 
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i) 
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) 

# write dot file to use with graphviz 
# run "dot -Tpng test.dot >test.png" 
nx.write_dot(G,'test.dot') 

# same layout using matplotlib with no labels 
plt.title('draw_networkx') 
pos=nx.graphviz_layout(G, prog='dot') 
nx.draw(G, pos, with_labels=False, arrows=False) 
plt.savefig('nx_test.png') 

Graphviz output

NetworkX/Matplotlib output

をnetworkx-2.0の更新されたバージョンであることを行う方法を示し、上記の解決策に類似している(とこれからのnetworkx-2.1も矢を描く)。

import networkx as nx 
from networkx.drawing.nx_agraph import write_dot, graphviz_layout 
import matplotlib.pyplot as plt 
G = nx.DiGraph() 

G.add_node("ROOT") 

for i in range(5): 
    G.add_node("Child_%i" % i) 
    G.add_node("Grandchild_%i" % i) 
    G.add_node("Greatgrandchild_%i" % i) 

    G.add_edge("ROOT", "Child_%i" % i) 
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i) 
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) 

# write dot file to use with graphviz 
# run "dot -Tpng test.dot >test.png" 
write_dot(G,'test.dot') 

# same layout using matplotlib with no labels 
plt.title('draw_networkx') 
pos =graphviz_layout(G, prog='dot') 
nx.draw(G, pos, with_labels=False, arrows=True) 
plt.savefig('nx_test.png') 

enter image description here

+0

ああ!だから私が必要としたのは、「ドット」レイアウトを持つ有向グラフでした。私はそれが非常に小さいものであることを知っていた。ありがとうAric! – max

+0

ノードに昇順にラベルを付ける良い方法はありますか?これは私がグラフg = nx.full_rary_tree(2,10)を作成することを意味しています。私がエッジを印刷すると、 '[(0,1)、(0,2)、(1,3)、( 1、4)、(2、5)、...] 'しかし、それは異なる順序でそれらを視覚化します... – CodeKingPlusPlus

+0

どのような順序が欲しいですか? bfs_edges()およびdfs_edges()を参照してください。 – Aric

6

あなたが近づくためにpygraphvizを使用することができます。

>>> import pygraphviz 
>>> import networkx 
>>> import networkx as nx 
>>> G = nx.Graph() 
>>> G.add_node("ROOT") 
>>> for i in xrange(5): 
...  G.add_node("Child_%i" % i) 
...  G.add_node("Grandchild_%i" % i) 
...  G.add_node("Greatgrandchild_%i" % i) 
...  G.add_edge("ROOT", "Child_%i" % i) 
...  G.add_edge("Child_%i" % i, "Grandchild_%i" % i) 
...  G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) 

>>> A = nx.to_agraph(G) 
>>> A.layout('dot', args='-Nfontsize=10 -Nwidth=".2" -Nheight=".2" -Nmargin=0 -Gfontsize=8') 
>>> A.draw('test.png') 

結果:私はあなたが上記の投稿のリンクからgraphvizのオプションをコピーし enter image description here

注意。私はなぜ4番目の子供が厳密に垂直なフォーマットの代わりに上に描かれているのか分かりません。おそらく、Graphvizのオプションについてもっと知っている人がそれを助けることができます。

+0

感謝。これはまさに私が試したときに見ていたものでした。私はそれがなぜこのようなものを作り出したのか、それは幾分奇妙なことがわかります。 – max

+4

networkxのバージョン1.11では、APIが変更されています。 'to_agraph'関数は' nx.nx_agraph.to_agraph'にあります。 – m00am

関連する問題