25

I'm trying to draw some DAGs using networkx 1.11 but I'm facing some errors, here's the test:

import networkx as nx

print nx.__version__

G = nx.DiGraph()
G.add_node(1,level=1)
G.add_node(2,level=2)
G.add_node(3,level=2)
G.add_node(4,level=3)

G.add_edge(1,2)
G.add_edge(1,3)
G.add_edge(2,4)

import pylab as plt
nx.draw_graphviz(G, node_size=1600, cmap=plt.cm.Blues,
                 node_color=range(len(G)),
                 prog='dot')
plt.show()

And here's the traceback:

Traceback (most recent call last):
  File "D:\sources\personal\python\framework\stackoverflow\test_dfs.py", line 69, in <module>
    prog='dot')
  File "d:\virtual_envs\py2711\lib\site-packages\networkx\drawing\nx_pylab.py", line 984, in draw_graphviz
    pos = nx.drawing.graphviz_layout(G, prog)
AttributeError: 'module' object has no attribute 'graphviz_layout'

I'm using python 2.7.11 x64, networkx 1.11 and I've installed graphviz-2.38 having dot available in PATH. What am I missing?

Once it works, how could i draw the graph with nodes which:

  • Use white background color
  • Have labels inside
  • Have directed arrows
  • Are arranged nicely either automatically or manually

Something similar to the below image

enter image description here

As you can see in that image, nodes are aligned really nicely

3
  • Use either nx.graphviz_layout or nx.drawing.nx_agraph.graphviz_layout. Commented Sep 11, 2016 at 13:19
  • @ValentinLorentz When trying nx.graphviz_layout I'll get AttributeError: 'module' object has no attribute 'graphviz_layout' but using nx.drawing.nx_agraph.graphviz_layout kinda works. Although neither nx.graphviz_layout(G, prog='dot') nor nx.drawing.nx_agraph.graphviz_layout(G) are showing anything. If you could provide a mcve example of this I could validate your answer, thanks! Commented Sep 12, 2016 at 9:43
  • How do you get the graph to have that theme, with the labels in the nodes? Commented Jan 23, 2017 at 18:37

1 Answer 1

43
+50

The package layout has changed in later versions of networkx. You can import the graphivz_layout function explicitly.

import networkx as nx
import pylab as plt
from networkx.drawing.nx_agraph import graphviz_layout


G = nx.DiGraph()
G.add_node(1,level=1)
G.add_node(2,level=2)
G.add_node(3,level=2)
G.add_node(4,level=3)

G.add_edge(1,2)
G.add_edge(1,3)
G.add_edge(2,4)

nx.draw(G, pos=graphviz_layout(G), node_size=1600, cmap=plt.cm.Blues,
        node_color=range(len(G)),
        prog='dot')
plt.show()

enter image description here

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

3 Comments

Graphviz can do what you want. Thanks for the vote but changing the question after the answer is given isn't so nice meta.stackoverflow.com/questions/296489/…
You should award the bounty for answering your question as originally posed. I can answer your follow-up question but it is different than your original question.
A minor change @Aric: When using graphviz_layout explicitly, the prog= argument needs to be passed to graphviz_layout, not .draw. If not "neato" is assumed (per the docs).

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.