NetworkX graphviz_layout 不工作?

Posted

技术标签:

【中文标题】NetworkX graphviz_layout 不工作?【英文标题】:NetworkX graphviz_layout not working? 【发布时间】:2015-07-14 13:46:26 【问题描述】:

我在尝试使用 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”,输出图像都是相同的,并且所有节点相互重叠。有人可以帮我吗?谢谢!

【问题讨论】:

G=some_graph() 不足以让我们重现您的问题。你能给出一个有这个问题的图表,或者至少告诉我们你的G的属性吗? 【参考方案1】:

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

【讨论】:

听起来很有希望。你能和外行分享G=some_graph()是什么吗? 任何类型的 nx.graphviz 例如G=nx.graphviz_layout(G,prog="dot", root=1000, args='-splines=true -nodesep=0.6 -overlap=scalexy' )【参考方案2】:

我对 pygraphviz 的documentation 的阅读表明overlap 不适用于dot

对于nodesep

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

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

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

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

【讨论】:

【参考方案3】:
    关于“重叠”,您的意思是当前输出中有上次绘制的节点吗?如果是,请添加“plt.clf()"after"plt.savefig(****)”! 关于node_size,默认是300,但是文档中没有给出单位。这几天我也在用networkx,你知道的话能告诉我单位吗?

【讨论】:

以上是关于NetworkX graphviz_layout 不工作?的主要内容,如果未能解决你的问题,请参考以下文章

Python3画图系列——NetworkX初探

python3 networkx

python+networkx

如何用networkx绘制社区

python-networkx学习

用 GraphScope 像 NetworkX 一样做图分析