¿Qué podría hacer que NetworkX y PyGraphViz funcionen bien solos pero no juntos?

Estoy trabajando para aprender algo de visualización de gráficos Python. Encontré algunas publicaciones de blog haciendo algunas cosas que quería probar. Desafortunadamente, no llegué demasiado lejos, encontré este error: AttributeError: 'module' object has no attribute 'graphviz_layout'

El fragmento de código más simple que reproduce el error en mi sistema es este,

 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' 

Encontré una pregunta similar, y las publicaciones que tienen dificultades con este combo, pero no el mismo error. Uno estaba cerca , pero se resolvió automágicamente.

Primero, verifiqué que todos los paquetes requeridos para NetworkX y PyGraphViz (que enumera requisitos similares a Scipy ) fueron instalados.

A continuación, busqué cortes para probar mi instalación de estos módulos en Python. Los dos primeros ejemplos son de la documentación de referencia de NetworkX . Esto enumera algunos ejemplos de recortes utilizando tanto MatPlotLib como GraphViz.

El ejemplo del código de MatPlotLib funciona para mí (representa una imagen en la pantalla) ,

 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() 

Sin embargo, los recortes GraphViz también producen errores similares,

 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)  in () ----> 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)  in () ----> 1 A=nx.to_agraph(G) AttributeError: 'module' object has no attribute 'to_agraph' In [20]: print G complete_graph(5) 

Luego probé la página de tutoriales de PyGraphViz sobre Diseño y Dibujo . Esto tiene algunos recortes también. PyGraphViz pasó con Neato (predeterminado), PyDot y Circo Post Script salida (visto con Gimp). (La única diferencia es que estos ejemplos de PyGraphViz no se representan en la pantalla, sino en archivos).

 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') 

Para boost la complejidad, PyGraphViz requiere los binarios del paquete GraphViz para poder funcionar. Estoy usando Arch Linux, e instalé la versión de esa distribución. Arch Linux tiene un ejemplo para probar la instalación (de nuevo, la salida al archivo) que también se aprobó .

¿Qué me estoy perdiendo? ¿Qué podría hacer que NetworkX y PyGraphViz funcionen bien solos pero no juntos?

Hay un pequeño error en la función draw_graphviz en networkx-1.11 activada por el cambio de que las herramientas de dibujo de graphviz ya no se importan al espacio de nombres de nivel superior de networkx.

La siguiente es una solución

 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) 

Para usar las otras funciones como to_agraph , write_dot , etc., necesitará usar explícitamente el nombre de ruta más largo

  nx.drawing.nx_agraph.write_dot() 

o importar la función en el espacio de nombres de nivel superior

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

nx.nx_pydot.graphviz_layout() parece ser la forma de usar graphviz_layout en la versión 1.11 de Networkx .

Es posible que necesite instalar Graphviz a través de

 sudo apt-get install graphviz 

Algún código de ejemplo de la documentación:

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

Sugiero esto como la documentación Graphviz_layout para 1.11