Что может заставить NetworkX & PyGraphViz нормально работать в одиночку, но не вместе?

Я работаю над изучением визуализации Python-графа. Я нашел несколько постов в блоге, делающих то, что я хотел попробовать. К сожалению, я не зашел слишком далеко, столкнувшись с этой ошибкой: AttributeError: 'module' object has no attribute 'graphviz_layout'

Простейший фрагмент кода, который воспроизводит ошибку в моей системе:

In [1]: import networkx as nx
In [2]: G=nx.complete_graph(5)
In [3]: nx.draw_graphviz(G)
------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-3-481ad1c1771c> in <module>()
----> 1 nx.draw_graphviz(G)
/usr/lib/python2.7/site-packages/networkx/drawing/nx_pylab.pyc in draw_graphviz(G, prog, **kwargs)
982 See networkx.draw_networkx() for a description of optional keywords.
983 """
--> 984 pos = nx.drawing.graphviz_layout(G, prog)
985 draw(G, pos, **kwargs)
986
AttributeError: 'module' object has no attribute 'graphviz_layout'

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

Сначала я проверил все необходимые пакеты для NetworkX и PyGraphViz (в которых перечислены требования, аналогичные Scipy).

Затем я искал фрагменты кода, чтобы проверить мою установку этих модулей в Python. Первые два примера взяты из справочной документации по NetworkX. В этом списке приведены несколько примеров фрагментов с использованием MatPlotLib и GraphViz.

Пример кода MatPlotLib работает для меня (отображает изображение на экран),

In [11]: import networkx as nx
In [12]: G=nx.complete_graph(5)
In [13]: import matplotlib.pyplot as plt
In [13]: nx.draw(G)
In [13]: plt.show()  

Тем не менее, фрагменты GraphViz также вызывают аналогичные ошибки,

In [16]: import networkx as nx
In [17]: G=nx.complete_graph(5)
In [18]: H=nx.from_agraph(A)
------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-18-808fa68cefaa> in <module>()
----> 1 H=nx.from_agraph(A)
AttributeError: 'module' object has no attribute 'from_agraph'
In [19]: A=nx.to_agraph(G)
------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-19-32d1616bb41a> in <module>()
----> 1 A=nx.to_agraph(G)
AttributeError: 'module' object has no attribute 'to_agraph'
In [20]: print G
complete_graph(5)

Затем я попробовал учебную страницу PyGraphViz по Layout & Drawing. У этого также есть некоторые отрывки. PyGraphViz передается с выводом Neato (по умолчанию), PyDot и Circo Post Script (просматривается с помощью Gimp). (Единственное отличие состоит в том, что эти примеры PyGraphViz отображаются не на дисплее, а в файлах).

In [1]: import pygraphviz as pgv
In [2]: d={'1': {'2': None}, '2': {'1': None, '3': None}, '3': {'2': None}}
In [3]: A=pgv.AGraph(d)
In [4]: A.write("pygraphviz_test_01.dot")
In [5]: A.layout()
In [6]: A.draw('pygraphviz_test_01.png')

В дополнение к сложности, для работы PyGraphViz требуются двоичные файлы пакета GraphViz. Я использую Arch Linux и установил версию этого дистрибутива. В Arch Linux есть пример для тестирования установки (опять же, вывод в файл), который также прошел.

Что мне не хватает? Что может заставить NetworkX & PyGraphViz нормально работать в одиночку, но не вместе?

2 ответа

Решение

Есть небольшая ошибка в draw_graphviz функция в networkx-1.11 вызвана изменением того, что инструменты рисования graphviz больше не импортируются в пространство имен верхнего уровня networkx.

Ниже приводится обходной путь

In [1]: import networkx as nx

In [2]: G = nx.complete_graph(5)

In [3]: from networkx.drawing.nx_agraph import graphviz_layout

In [4]: pos = graphviz_layout(G)

In [5]: nx.draw(G, pos)

Чтобы использовать другие функции, такие как to_agraph, write_dotи т.д. вам нужно будет явно использовать более длинный путь

 nx.drawing.nx_agraph.write_dot()

или импортируйте функцию в пространство имен верхнего уровня

from networkx.drawing.nx_agraph import write_dot()
write_dot()

nx.nx_pydot.graphviz_layout() кажется, способ использовать graphviz_layout в версии Networkx 1.11.

Вам может понадобиться установить Graphviz через

sudo apt-get install graphviz

Пример кода из документации:

import networkx as nx
G = nx.complete_graph(4)
pos = nx.nx_pydot.graphviz_layout(G)

Я предлагаю это как документацию Graphviz_layout для 1.11

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