2016-02-08 16 views
26

Ich arbeite an etwas Python Graph Visualisierung zu lernen. Ich habe ein paar Blog-Posts gefunden somethings Ich wollte es versuchen. Leider kam ich nicht zu weit, um diesen Fehler zu begegnen: AttributeError: 'module' object has no attribute 'graphviz_layout'Was kann dazu führen, dass NetworkX & PyGraphViz alleine funktioniert, aber nicht zusammen?

Die einfachste Schnipsel von Code, der den Fehler auf meinem System reproduziert das ist,

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' 

ich ein ähnliches questions gefunden, und posts Schwierigkeiten mit dieser Kombination, aber nicht ganz der gleiche Fehler. Einer war close, aber es hat sich automatisch gelöst.

Zuerst habe ich überprüft alle benötigten Pakete für NetworkX und PyGraphViz (die ähnliche Anforderungen an Scipy Listen) installiert.

Als nächstes suchte ich nach Snips, um meine Installation dieser Module in Python zu testen. Die ersten beiden Beispiele stammen aus der NetworkX Reference Documentation. Dies listet einige Beispiel-Snips auf, die sowohl MatPlotLib als auch GraphViz verwenden.

Der matplotlib Codebeispiel funktioniert für mich (ein Bild auf den Bildschirm macht),

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

jedoch die GraphViz schnitzel produzieren auch ähnliche Fehler,

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) 

Dann Ich habe versucht PyGraphViz Tutorial Seite auf Layout & Drawing. Dies hat auch einige Scheren. PyGraphViz hat mit Neato (Standard), PyDot und Circo Post Script Ausgabe (angezeigt mit Gimp) übergeben. (Der einzige Unterschied besteht darin, dass diese PyGraphViz-Beispiele nicht auf dem Display angezeigt werden, sondern auf Dateien).

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

Zur Komplexität, PyGraphViz requires GraphViz Paket Binärdateien, um zu arbeiten. Ich benutze Arch Linux und installiere die Version dieser Distribution. Arch Linux hat eine example to test installation (wieder Ausgabe in Datei) , die auch passiert.

Was fehlt mir? Was könnte dazu führen, dass NetworkX & PyGraphViz alleine gut funktioniert, aber nicht zusammen?

Antwort

48

Es gibt einen kleinen Fehler in der draw_graphviz Funktion in NetworkX-1.11 durch die Änderung ausgelöst, dass die graphviz Zeichenwerkzeug werden nicht importiert mehr in den Top-Level-Namespace von NetworkX.

Hier finden Sie eine Abhilfe

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) 

die anderen Funktionen nutzen zu können, wie to_agraph, write_dot, etc. Sie explizit benötigen den längeren Pfadnamen

nx.drawing.nx_agraph.write_dot() 

oder importieren Sie die Funktion in verwenden, der Namespace der obersten Ebene

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

nx.nx_pydot.graphviz_layout() scheint der Weg zu sein, graphviz_layout in Netzwerkx Release 1.11 zu verwenden.

Sie müssen möglicherweise Graphviz über

sudo apt-get install graphviz 

Einige Beispiel-Code aus der Dokumentation installieren:

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

Ich schlage vor, dies als Graphviz_layout documentation for 1.11