NetworkX的graphviz_layout无法工作?

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”,输出图像都是相同的,所有节点都重叠在一起。有人能帮我吗?谢谢!

2
G=some_graph()这样的代码并不足以让我们重现您的问题。您能否提供一个出现问题的图形,或者至少告诉我们您的G的属性? - Joel
3个回答

3
对我来说,似乎为了给prog提供args,你需要使用格式'-G' + 'argsname = x'。 我注意到在他们在文档中提供的示例中,arg epsilon是这样的: G.draw('test.ps',prog='twopi',args='-Gepsilon=1')。所以我尝试了下面显示的模式。 我只是在参数前面加了G。 现在,这些参数根据您使用的程序而有所不同,因此您肯定希望使用'dot'来实现您想要的目标。 您可以在此处查看所有可能的参数以及它们如何与每个prog一起使用。 对于我的目的,我需要将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")

这里是我的图表与使用和不使用args参数的比较,代码如下。首先是不使用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' )  

使用参数的图形

因此,您可以看到一旦我让参数工作,这些图像就不同了。


听起来很有前途。你能否向不熟悉的人分享一下G=some_graph()是什么? - Sergey Bushmanov
任何类型的nx.graphviz,例如G=nx.graphviz_layout(G,prog="dot", root=1000, args='-splines=true -nodesep=0.6 -overlap=scalexy') - bart cubrich

1

根据我阅读的pygraphviz文档,似乎overlapdot不兼容。

关于nodesep

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

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

我注意到您正在设置节点位置,然后稍后再设置节点大小,并且您将node_size设置得比默认值大很多(600与300相比)。由于当它找到pos时不知道您将使用什么样的node_size,所以使用足够大的node_size会导致重叠。

所以我建议将node_size设为默认值,如果仍有重叠,则将node_size设为较小值。 如果在排名之间或内部存在不成比例的分离问题,则尝试调整ranksepnodesep

-1
  1. 关于“overlap”,您是指当前输出中是否存在上一次绘制的节点?如果是这样,请在“plt.savefig(****)”之后添加“plt.clf()”!
  2. 关于节点大小,文档中没有给出默认值的单位。我最近也在使用networkx,如果您知道单位,请告诉我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接