2015-08-24 9 views
5

Ich möchte nur mit Python eine einfache Grafik zeichnen 3 NetworkX & graphviz:Python 3 NetworkX draw_graphviz() funktioniert nicht

import networkx as nx 

G = nx.complete_graph(3) 
nx.draw_graphviz(G) 

Ich verwende ubuntu14.04 und IPython3 und wie üblich Ich habe PIP3 installieren NetworkX und laufen gab der Code mir:

ImportError: pydot could not be loaded: http://code.google.com/p/pydot/ 

und ich versuchte pydotplus und laufen Sie den Code installieren:

/usr/local/lib/python3.4/dist-packages/networkx/drawing/nx_pydot.py in pydot_layout(G, prog, root, **kwds) 
    294 
    295   if isinstance(node,list): 
--> 296    node=node[0] 
    297   pos=node.get_pos()[1:-1] # strip leading and trailing double quotes 
    298   if pos != None: 

IndexError: list index out of range 
auch

und pydot2:

/usr/local/lib/python3.4/dist-packages/pydot.py in write(self, path, prog, format) 
    1893    prog = self.prog 
    1894 
-> 1895   dot_fd = file(path, "w+b") 
    1896   if format == 'raw': 
    1897    data = self.to_string() 

NameError: name 'file' is not defined 

verbrachte ich einige Zeit in der Suche und andere pydots und pygraphviz Kombinationen bereits, aber noch kein Glück installieren.

Während dies in Beziehung gesetzt werden: pydot and graphviz error: Couldn't import dot_parser, loading of dot files will not be possible, das löst nicht das Problem in Python 3.

+0

Does this https: // Gruppen .google.com/forum/#! topic/pygraphviz-discuss/mbK5voZ9-hs erklären etwas von dem Problem? – Joel

+0

Ich denke, pygraphviz hängt von der Analyse der [DOT-Sprache] ab (https://en.wikipedia.org/wiki/DOT_%28graph_description_language%29), was ist die Aufgabe von pydot? Und nun ist es irgendwie pydot, das mit Python3 und nicht mit pygraphviz inkompatibel ist. – pterodragon

+0

FWIW, Ich erreichte das gewünschte Ergebnis, indem ich eine .dot-Datei mit 'networkx.write_dot (G, 'graph.dot') ausgab und dann den entsprechenden graphviz-Ausgabebefehl wie' neato -T png graph.dot> graph.png ausführte '. (graphviz muss vorher installiert werden; siehe die man-Seite für mehr) – pterodragon

Antwort

2

Sie können dieses Problem beheben, indem Sie die Linie #292 aus:

pydot_node = pydot.Node(make_str(n)).get_name() #.encode('utf-8') 

Ich habe diesen Fehler gemeldet/here beheben:

pydot_node = pydot.Node(make_str(n)).get_name().encode('utf-8') 

die Encodierung am Ende zu entfernen.

+0

Es löst den Fehler bei der Verwendung von Pydotplus in diesem Fall :). Aber ich kann das Matplotlib-Fenster-Popup immer noch nicht sehen? – pterodragon

+0

@pterodragon Ist Matplotlib im interaktiven Modus? Möglicherweise müssen Sie eine 'plt.show()' ausführen, damit das Fenster angezeigt wird. – mfitzp

+0

Ich dachte, es wird automatisch angezeigt. Danke für Ihre Hilfe! :) – pterodragon

1

Nicht eine sehr große Antwort, aber es wirkt als Behelfslösung.

Erste Ausgabe der .dot-Datei von networkx.write_dot(G, 'graph.dot') Python

und führen Sie dann den entsprechenden graphviz Ausgabebefehl wie neato -T png graph.dot > graph.png auf der Kommandozeile.

2

Dies scheint das gleiche Problem zu sein, dass der von Ihnen verwendete Pydot eine Version ist, die mit Python 3 nicht kompatibel ist und Datei (...) verwendet. Datei (...) wird bereits in Python 3 entfernt.

Ich habe dieses Problem festgestellt und eine Python 3-kompatible Version auf PyPi eingerichtet.

Für Linux-Systeme für 3.x Python, versuchen:

pip3 install pydot3

Oder im Allgemeinen für Python 2.x, versuchen:

pip install pydot3