Использование networkX для вывода древовидной структуры

Я использую networkX для создания древовидной структуры следующим образом (я следую за ответом на этот вопрос).

import networkx as nx
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.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')

Я хочу нарисовать дерево как на следующем рисунке. введите описание изображения здесь

Однако я получаю сообщение об ошибке AttributeError: module 'networkx' has no attribute 'write_dot', Моя версия networkx - 1.11 (используется conda). Я пробовал разные хаки, но ни один из них не работал.

Итак, мне интересно знать, существует ли другой способ рисования древовидных структур с использованием networkx, чтобы получить результат, аналогичный тому, который упомянут на рисунке. Пожалуйста, дайте мне знать.

2 ответа

Решение

Вы можете нарисовать орграф полностью с pygraphviz,

Следующие шаги должны быть выполнены в первую очередь, как pygraphviz не работает без graphviz (по состоянию на сейчас).

  1. Загрузите graphviz-2.38.msi с http://www.graphviz.org/Download_windows.php и установите
  2. Загрузите 2.7 или 3.4 pygraphviz файл колеса с http://www.lfd.uci.edu/~gohlke/pythonlibs/
  3. Перейдите в каталог, в который вы скачали файл колеса, и запустите колесо, специфичное для вашей платформыpip install pygraphviz‑1.3.1‑cp34‑none‑win32.whl
  4. добавлять dot.exe путь к хосту, например, на панели управления Windows -> Система -> Изменить переменные среды -> Изменить путь

После этого dot а также png Файлы могут быть созданы, как показано ниже.

Рабочий код

import pygraphviz as pgv

G=pgv.AGraph(directed=True)

#Attributes can be added when adding nodes or edge
G.add_node("ROOT", color='red')
for i in range(5):
    G.add_node("Child_%i" % i, color='blue')
    G.add_node("Grandchild_%i" % i, color='blue')
    G.add_node("Greatgrandchild_%i" % i, color='blue')

    G.add_edge("ROOT", "Child_%i" % i, color='blue')
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i, color='blue')
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i, color='blue')

# write to a dot file
G.write('test.dot')

#create a png file
G.layout(prog='dot') # use dot
G.draw('file.png')

Файл PNG
введите описание изображения здесь

Я думаю, что эта проблема была решена на networkx 2.x, но до этого вы должны явно импортировать функцию, подобную этой.

from networkx.drawing.nx_agraph import write_dot

или же

from networkx.drawing.nx_pydot import write_dot

Я надеюсь, что это работает.

Другие вопросы по тегам