1. ホーム
  2. python

[解決済み] NetworkXから階層的な出力を保証する方法はありますか?

2023-01-20 03:43:41

質問

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

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

そのような構造を保証するにはどうしたらよいのでしょうか?

不信心者のための例

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

どのように解決するのですか?

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

<イグ

アップデートのお知らせ

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')