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