Есть ли способ гарантировать иерархический вывод из NetworkX?
Я пытаюсь создать блок-схему a дерево структура. Я смог создать репрезентативные графики с 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()
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')
обновлено
вот версия обновлена для 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')
вы можете использовать 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, может помочь в этом.




Comments