Есть ли способ гарантировать иерархический вывод из NetworkX?



Я пытаюсь создать блок-схему a дерево структура. Я смог создать репрезентативные графики с networkx, но мне нужен способ показать дерево структура при выводе графика. Я использую matplotlib.pylab для построения графика.

Мне нужно показать данные в структуре, похожей на то, что показано здесь. Хотя у меня нет подграфов.

Как я могу гарантировать такую конструкцию?

примеры для неверующих:

Various NetworkX layouts

я смог показать графики с помощью 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()
166   2  

2 ответов:

Если вы используете ориентированный граф, то макет Graphviz dot будет делать что-то вроде того, что вы хотите с деревом. Вот некоторый код, подобный приведенным выше решениям, который показывает, как это сделать

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

вы можете использовать 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')

результат: enter image description here

примечание Я скопировал параметры graphviz из ссылки, которую вы опубликовали выше. Я не уверен, почему 4-й ребенок рисуется сверху, а не в строго вертикальном формате. Может быть, кто-то, кто знает больше о вариантах Graphviz, может помочь в этом.

    Ничего не найдено.

Добавить ответ:
Отменить.