Я пытаюсь создать блок-схему древовидной структуры. Я смог создать репрезентативные графики с помощью 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()
g = nx.full_rary_tree(2, 10)
Если я распечатаю края, которые я получаю:[(0, 1), (0, 2), (1, 3), (1, 4), (2, 5), ... ]
но он будет визуализировать их в другом порядке ...pygraphviz
обычными способами, попробуйтеpip install --install-option="--include-path=/usr/local/include/" --install-option="--library-path=/usr/local/lib/" pygraphviz
graphviz
(в моем случае использовалbrew install graphviz
).Вы можете использовать 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, сможет в этом помочь.
источник
to_agraph
функция находится в папкеnx.nx_agraph.to_agraph
.Вы можете использовать grandalf для решения только для Python, если не хотите устанавливать graphviz.
Кроме того, этот тип визуализации называется рисованием многоуровневого графа или рисованием графа в стиле Сугияма , который может отображать многие виды графиков, в том числе не деревья.
См. Мой ответ на другой вопрос для получения подробной информации и реализации.
источник