有没有一种方法可以保证NetworkX的分层输出?

我试图产生一个结构的stream程图。 我已经能够用networkx创build代表性的graphics,但是当我输出一个graphics时,我需要一种显示树形结构的方法。 我正在使用matplotlib.pylab来绘制graphics。

我需要以类似于这里显示的结构显示数据。 虽然我没有子图。

我怎样才能保证这样的结构?

非信徒的例子:

各种NetworkX布局

我已经能够用pylab和graphviz显示graphics,但都不提供我正在寻找的树形结构。 我试过每个布局networking必须提供,但没有一个显示层次结构 。 我只是不知道什么选项/模式给予如果我需要使用权重。 任何build议将帮助一堆。

@jterrace:

下面是我用来制作上面情节的粗略概述。 我已经添加了一些标签,但除此之外它是一样的。

import networkx as nx import matplotlib.pyplot as plt G = nx.Graph() G.add_node("ROOT") for i in xrange(5): G.add_node("Child_%i" % i) G.add_node("Grandchild_%i" % i) G.add_node("Greatgrandchild_%i" % i) G.add_edge("ROOT", "Child_%i" % i) G.add_edge("Child_%i" % i, "Grandchild_%i" % i) G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) plt.title("draw_networkx") nx.draw_networkx(G) plt.show() 

如果你使用有向图,那么Graphviz点布局将会像你想要的那样做树。 以下是一些类似于上述解决scheme的代码,展示了如何做到这一点

 import networkx as nx import matplotlib.pyplot as plt G = nx.DiGraph() G.add_node("ROOT") for i in xrange(5): G.add_node("Child_%i" % i) G.add_node("Grandchild_%i" % i) G.add_node("Greatgrandchild_%i" % i) G.add_edge("ROOT", "Child_%i" % i) G.add_edge("Child_%i" % i, "Grandchild_%i" % i) G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) # write dot file to use with graphviz # run "dot -Tpng test.dot >test.png" nx.write_dot(G,'test.dot') # same layout using matplotlib with no labels plt.title('draw_networkx') pos=nx.graphviz_layout(G, prog='dot') nx.draw(G, pos, with_labels=False, arrows=False) plt.savefig('nx_test.png') 

Graphviz输出

NetworkX / Matplotlib输出

你可以使用pygraphviz来closures:

 >>> import pygraphviz >>> import networkx >>> import networkx as nx >>> G = nx.Graph() >>> G.add_node("ROOT") >>> for i in xrange(5): ... G.add_node("Child_%i" % i) ... G.add_node("Grandchild_%i" % i) ... G.add_node("Greatgrandchild_%i" % i) ... G.add_edge("ROOT", "Child_%i" % i) ... G.add_edge("Child_%i" % i, "Grandchild_%i" % i) ... G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) >>> A = nx.to_agraph(G) >>> A.layout('dot', args='-Nfontsize=10 -Nwidth=".2" -Nheight=".2" -Nmargin=0 -Gfontsize=8') >>> A.draw('test.png') 

结果: 在这里输入图像说明

注意我从上面发布的链接复制了graphviz选项。 我不确定为什么第四个孩子是在顶部,而不是在严格的垂直格式。 也许对Graphviz选项有更多了解的人可以帮助解决这个问题。