wpqmanu
wpqmanu

Reputation: 51

NetworkX graphviz_layout not working?

I encountered a problem when trying to plot a graph with many nodes using NetworkX and graphviz_layout. More specifically, the arguments that pass into nx.graphviz_layout do not help at all. Attached is the code I use:

G=some_graph()

import matplotlib.pyplot as plt
plt.figure(figsize=(32,32))

# use graphviz to find radial layout
pos=nx.graphviz_layout(G,prog="dot",
                       root=1000,
                       args='-splines=true -nodesep=0.6 -overlap=scalexy'
                       )

nx.draw(G,pos,
        with_labels=True,
        alpha=0.5,
        node_size=600,
        font_size=10
        )

plt.savefig("imagenet_layout.png")

No matter how I change "args" in nx.graphviz_layout, the output image would be the same, and all nodes overlap with each other. Could anybody help me with this? Thanks!

Upvotes: 5

Views: 5272

Answers (3)

bart cubrich
bart cubrich

Reputation: 1254

For me it seems that in order to give args to the prog you need to use the format '-G' +'argsname=x'. I noticed in the example they give the docs the arg epsilon asG.draw(‘test.ps’,prog=’twopi’,args=’-Gepsilon=1’). So I tried out that pattern as shown below. I just added G in front of the arguments. Now, these arguments vary quite a bit depending on what prog you use, so you definitely want to use 'dot' for what you want to accomplish. You can see all the possible arguments and how they work with each prog here. For my porpoises, I needed to have the nodesep=0.01.

G=some_graph()

import matplotlib.pyplot as plt
plt.figure(figsize=(32,32))

# use graphviz to find radial layout
pos=nx.graphviz_layout(G,prog="dot",
                       root=1000,
                       args='-Gsplines=true -Gnodesep=0.6 -Goverlap=scalexy'
                       )

nx.draw(G,pos,
        with_labels=True,
        alpha=0.5,
        node_size=600,
        font_size=10
        )

plt.savefig("imagenet_layout.png")

Here is a comparison of my graph with and without the args, with code. First without the args.

A = nx.nx_agraph.to_agraph(G)        # convert to a graphviz graph
A.layout(prog='neato')            # neato layout
#A.draw('test3.pdf')

A.draw('test3.png' )     

No args figure

With args

A = nx.nx_agraph.to_agraph(G)        # convert to a graphviz graph
A.layout(prog='dot')            # neato layout
#A.draw('test3.pdf')

A.draw('test3.png',args='-Gnodesep=0.01 -Gfont_size=1', prog='dot' )  

Figure using dot with args

SO you can see that the images are different once I got the args to work.

Upvotes: 3

Zhukov Zhang
Zhukov Zhang

Reputation: 1

  1. About “overlap”,do you mean there are nodes drawed last time in current output? If so, add "plt.clf()"after"plt.savefig(****)"!
  2. About the node_size, the default is 300, but the unit is not given in the document. I am using networkx these days too, can you tell me the unit if you know that?

Upvotes: -1

Joel
Joel

Reputation: 23887

My reading of the documentation for pygraphviz suggests that overlap does not work with dot.

For nodesep :

In dot, this specifies the minimum space between two adjacent nodes in the same rank, in inches.

It's not clear if the overlaps you are observing are between nodes in the same rank or between the ranks. If it is just between ranks, you may want to modify ranksep.

I do see that you are setting the positions, and then later you set the nodesize, and you are making node_size quite a bit larger than the default (600 vs 300). Since it does not know what node_size you are going to use when it finds pos, using a large enough node_size will cause overlap.

So I would recommend setting node_size to be the default, and if overlap remains, setting node_size to be smaller. If you're having issues with the between or within rank separations being out of proportion, then play with ranksep and nodesep.

Upvotes: 1

Related Questions