NetworkXからの階層出力を保証する方法はありますか?


86

ツリー構造のフロー図を作成しようとしています。networkxで代表的なグラフを作成できましたが、ツリーを表示する方法が必要です、プロットを出力するときに構造です。matplotlib.pylabを使用してグラフをプロットしています。

ここに示さているのと同様の構造でデータを表示する必要があります。サブグラフはありませんが。

どうすればそのような構造を保証できますか?

不信者の例:

さまざまなNetworkXレイアウト

pylabとgraphvizでグラフを表示することはできましたが、どちらも私が探しているツリー構造を提供していません。networkxが提供するすべてのレイアウトを試しましたが、いずれも階層を示していません。どのオプション/モードを指定するか、またはウェイトを使用する必要があるかどうかがわかりません。どんな提案でもたくさん助けになるでしょう。

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

回答:


118

有向グラフを使用する場合、Graphvizドットレイアウトはツリーで希望するようなことを行います。これは、上記のソリューションに似たコードで、その方法を示しています。

import networkx as nx
from networkx.drawing.nx_agraph import 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"
nx.nx_agraph.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=False)
plt.savefig('nx_test.png')

Graphviz出力

NetworkX / Matplotlib出力

更新しました

これは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')

ここに画像の説明を入力してください


1
あはは!したがって、必要なのは「ドット」レイアウトの有向グラフだけでした。私はそれが非常に小さいものであることを知っていました。どうもありがとうアリック!
最大

ノードに昇順でラベルを付ける良い方法はありますか?つまり、g = nx.full_rary_tree(2, 10)取得したエッジを印刷するとグラフが作成され[(0, 1), (0, 2), (1, 3), (1, 4), (2, 5), ... ]ますが、異なる順序で視覚化されます...
CodeKingPlusPlus 2013年

1
PyGrapvizは、Python 3で動作し、このコードは、Python 3で動作します
ARIC

3
またpygraphviz、通常の方法でインストールする際に問題が発生した場合は、試してみてくださいpip install --install-option="--include-path=/usr/local/include/" --install-option="--library-path=/usr/local/lib/" pygraphviz
Rotail 2018

2
@Rotailこれは、インストール後に機能しましたgraphviz(私の場合はを使用していますbrew install graphviz)。
シヴェンドラ2018

10

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オプションをコピーしたことに注意してください。4番目の子が厳密に垂直形式ではなく上に描画される理由がわかりません。たぶん、Graphvizオプションについてもっと知っている人がそれを手伝ってくれるでしょう。


ありがとう。これは私がそれを試したときに私が見ていたものとまったく同じでした。なぜこんなものができたのか不思議です。
最大

5
networkxのバージョン1.11では、APIが変更されていることに注意してください。to_agraph関数は、今に位置していますnx.nx_agraph.to_agraph
m00am 2016

1
子供が常に両親の下にいることを確認する方法はありますか?
ドロール

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.