5

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.

6
  • Does this groups.google.com/forum/#!topic/pygraphviz-discuss/mbK5voZ9-hs explain some of the issue? Commented Aug 24, 2015 at 22:21
  • I think pygraphviz depends on parsing of the DOT language which is the job of pydot? And now somehow it is pydot that is incompatible with Python3 rather than pygraphviz. Commented Aug 25, 2015 at 0:57
  • FWIW, I achieved the desired result by outputting a .dot file using networkx.write_dot(G, 'graph.dot') and then do the appropriate graphviz output command like neato -T png graph.dot > graph.png. (graphviz has to be installed beforehand; see the man page for more) Commented Sep 1, 2015 at 13:02
  • You might add that as an answer. Others with the same problem may not check the comments. Commented Sep 2, 2015 at 4:14
  • Some additional information: pygraphviz now claims to work with Python 3 right now but as of this moment I install it using the source by running python3 setup.py install, and import pygraphviz in Python3 gives me ImportError: No module named '_graphviz'. Commented Sep 2, 2015 at 15:31

3 Answers 3

2

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.

Sign up to request clarification or add additional context in comments.

3 Comments

It does resolve the error when using pydotplus in this case :). But I still can't see the matplotlib window popup?
@pterodragon Is matplotlib in interactive mode? You might need to do a plt.show() to get the window to appear.
I thought it will show automatically. Thanks for your help! :)
2

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

Comments

1

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.