web-dev-qa-db-fra.com

Qu'est-ce qui pourrait faire que NetworkX et PyGraphViz fonctionnent bien seuls mais pas ensemble?

Je travaille à apprendre quelques-uns Python visualisation graphique. J'ai trouvé quelques articles de blog faisant certainschoses je voulais essayer. Malheureusement, je n'est pas allé trop loin, rencontrant cette erreur: AttributeError: 'module' object has no attribute 'graphviz_layout'

La coupure de code la plus simple qui reproduit l'erreur sur mon système est la suivante,

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'

J'ai trouvé un questions , et posts ayant des difficultés avec ce combo, mais pas tout à fait la même erreur. L'une était close , mais elle s'est résolue automatiquement.

Tout d'abord, j'ai vérifié tous les packages requis pour NetworkX et PyGraphViz (qui répertorie les exigences similaires à Scipy =) ont été installés.

Ensuite, j'ai cherché des coupures pour tester mon installation de ces modules en Python. Les deux premiers exemples sont tirés de la Documentation de référence NetworkX =. Ceci répertorie quelques exemples de coupes utilisant à la fois MatPlotLib et GraphViz.

L'exemple de code MatPlotLib fonctionne pour moi (rend une image à l'écran) ,

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

Cependant, les snips GraphViz produisent également des erreurs similaires,

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)

Ensuite, j'ai essayé la page du tutoriel de PyGraphViz sur Layout & Drawing . Cela a aussi quelques coupures. PyGraphViz a réussi avec la sortie Neato (par défaut), PyDot et Circo Post Script (affiché à l'aide de Gimp). (La seule différence est que ces exemples PyGraphViz ne sont pas rendus à l'affichage, mais aux fichiers).

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

Ajoutant à la complexité, PyGraphViz nécessite GraphViz package binaires pour fonctionner. J'utilise Arch Linux et j'ai installé la version de cette distribution. Arch Linux a un exemple pour tester l'installation (encore une fois, sortie dans un fichier) qui a également réussi .

Qu'est-ce que je rate? Qu'est-ce qui pourrait faire fonctionner NetworkX & PyGraphViz correctement seul mais pas ensemble?

27
xtian

Il y a un petit bug dans le draw_graphviz fonction dans networkx-1.11 déclenchée par la modification selon laquelle les outils de dessin graphviz ne sont plus importés dans l'espace de noms de niveau supérieur de networkx.

Ce qui suit est une solution de contournement

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)

Pour utiliser les autres fonctions telles que to_agraph, write_dot, etc. vous devrez utiliser explicitement le nom de chemin le plus long

 nx.drawing.nx_agraph.write_dot()

ou importez la fonction dans l'espace de noms de niveau supérieur

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

nx.nx_pydot.graphviz_layout() semble être la façon d'utiliser graphviz_layout dans Networkx version 1.11 .

Vous devrez peut-être installer Graphviz via

Sudo apt-get install graphviz

Quelques exemples de code de la documentation:

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

Je suggère cela comme Documentation Graphviz_layout pour 1.11

2
Utku