tutorial pos python graph graphviz networkx pygraphviz

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



python networkx tutorial (2)

Estoy trabajando para aprender algo de visualización de gráficos Python. Encontré algunas publicaciones en el blog haciendo some things que quería probar. Desafortunadamente no llegué demasiado lejos, encontrándome con 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é questions similares, y las posts tienen dificultades con este combo, pero no el mismo error. Uno estaba close , pero se resolvió automágicamente.

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

Luego, busqué los recortes para probar mi instalación de estos módulos en Python. Los primeros dos ejemplos son de la documentación de referencia de NetworkX . Enumera algunos snips de ejemplo utilizando MatPlotLib y GraphViz.

El ejemplo del código 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) <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)

Luego probé la página de tutorial de PyGraphViz en Layout & Drawing . Esto tiene algunos recortes también. PyGraphViz pasó con Neato (predeterminado), PyDot y la salida de Circo Post Script (vista usando Gimp). (La única diferencia es que estos ejemplos de PyGraphViz no se representan en la pantalla, sino en los 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'')

Además de la complejidad, PyGraphViz requiere binarios del paquete GraphViz para funcionar. Estoy usando Arch Linux, e instalé esa versión de distribución. Arch Linux tiene un ejemplo para probar la instalación (otra vez, salida al archivo) que también pasó .

¿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 desencadenado por el cambio que las herramientas de dibujo graphviz ya no se importan en el espacio de nombre 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 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 utilizar graphviz_layout en Networkx versión 1.11 .

Es posible que necesite instalar Graphviz través de

sudo apt-get install graphviz

Algunos ejemplos de código 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