5

尝试使用 NetworkX 和 graphviz_layout 绘制具有许多节点的图形时遇到问题。更具体地说,传递给 nx.graphviz_layout 的参数根本没有帮助。附件是我使用的代码:

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")

无论我如何更改 nx.graphviz_layout 中的“args”,输出图像都是相同的,并且所有节点都相互重叠。有人可以帮我吗?谢谢!

4

3 回答 3

3

对我来说,似乎为了给你提供参数,prog你需要使用格式'-G'+'argsname = x'。我注意到在示例中他们给文档arg epsilon as G.draw(‘test.ps’,prog=’twopi’,args=’-Gepsilon=1’)。所以我尝试了如下所示的模式。我只是在论点前添加了 G 。现在,这些参数会根据您使用的 prog 有很大的不同,因此您肯定希望使用 'dot' 来完成您想要完成的任务。prog 您可以在此处查看所有可能的参数以及它们如何与每个参数一起使用。对于我的海豚,我需要 nodeep=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")

这是带有和不带有 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' )     

没有参数图

带参数

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' )  

图使用带 args 的点

因此,一旦我使 args 起作用,您就会看到图像有所不同。

于 2019-11-05T00:02:31.343 回答
1

我对 pygraphviz文档的阅读表明它overlap不适用于dot.

对于nodesep

在 dot 中,这指定了相同等级的两个相邻节点之间的最小间距,以英寸为单位。

目前尚不清楚您观察到的重叠是在同一等级的节点之间还是在等级之间。如果它只是在等级之间,您可能需要修改ranksep.

我确实看到您正在设置位置,然后您设置了节点大小,并且您的设置node_size比默认设置大很多(600 对 300)。由于它不知道node_size当它找到时你要使用什么pos,所以使用足够node_size大会导致重叠。

所以我建议设置node_size为默认值,如果重叠仍然存在,则设置得更node_size小。如果您对等级间或等级内的分隔不成比例有疑问,请使用ranksepand nodesep

于 2015-09-08T02:41:42.103 回答
-1
  1. 关于“重叠”,您的意思是当前输出中有上次绘制的节点吗?如果有,加“ plt.clf()"after"plt.savefig(****)”!
  2. 关于node_size,默认是300,但是文档中没有给出单位。这些天我也在使用networkx,如果你知道的话,你能告诉我单位吗?
于 2017-01-04T07:36:51.433 回答