Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python 3 networkx draw_graphviz() does not work

I just want to draw a simple graph with Python 3 networkx & graphviz:

import networkx as nx

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

I'm using ubuntu14.04 and IPython3 and as usual I did pip3 install networkx and running the code gave me:

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

And I tried installing pydotplus and running the code:

/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

and pydot2 also:

/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

I spent quite some time searching and installing other pydots and pygraphviz combinations already but still no luck.

While this may be related: pydot and graphviz error: Couldn't import dot_parser, loading of dot files will not be possible, that doesn't solve the problem in Python 3.

like image 222
pterodragon Avatar asked Aug 24 '15 13:08

pterodragon


3 Answers

You can fix this by editing the line #292 from:

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

to remove the encode at the end:

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

I've reported this bug/fix here.

like image 138
mfitzp Avatar answered Nov 16 '22 21:11

mfitzp


This seems to be the same issue as that the pydot you're using is a version incompatible with Python 3, which uses file(...). file(...) is removed in Python 3 already.

I noticed this issue and setup a Python 3 compatible version on PyPi.

For Linux systems for Python 3.x, try:

pip3 install pydot3

Or in general for Python 2.x, try:

pip install pydot3

like image 2
Log0 Avatar answered Nov 16 '22 22:11

Log0


Not a very great answer but it acts as a workaround.

First output the .dot file by networkx.write_dot(G, 'graph.dot') using Python

and then do the appropriate graphviz output command like neato -T png graph.dot > graph.png on the command line.

like image 1
pterodragon Avatar answered Nov 16 '22 21:11

pterodragon