97

ツリー構造のフロー図を作成しようとしています。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()
4

4 に答える 4

133

有向グラフを使用する場合、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')

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

于 2012-07-14T13:27:20.313 に答える
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オプションについてもっと知っている人がそれを手伝ってくれるでしょう。

于 2012-07-14T02:19:59.407 に答える
3

graphvizをインストールしたくない場合は、Pythonのみのソリューションにgrandalfを使用できます。

また、このタイプの視覚化は、レイヤードグラフ描画または杉山スタイルのグラフ描画と呼ばれ、非ツリーを含むさまざまな種類のグラフを表示できます。

詳細と実装については、別の質問に対する私の回答を参照してください。

于 2020-10-24T18:14:43.510 に答える
0

@Abdallah Sobehyによって作成された階層構造も参照してください。networkxを使用してPythonグラフを印刷するときに、左右の子を保持する際に、追加のモジュール/ライブラリ('pygraphviz'など)を使用する必要はありませ ん。

グラフは上記ほど良くないかもしれませんが、要求された仕事をします!

于 2021-11-09T08:51:07.967 に答える