是否有可能修改以下代码,使Child_4与Grandchild_0处于同一水平线上(从而将Grandchild_4推到其自己的层次)?
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_edge("ROOT", "Child_%i" % i)
G.add_edge("Child_%i" % i, "Grandchild_%i" % i)
pos=nx.graphviz_layout(G,prog='dot')
nx.draw(G,pos,arrows=False)
plt.show()
上面的代码生成了以下布局,我想通过将一个子元素向下移动一级以与孙元素水平对齐来修改它:
在Python网络库networkx中,我正在使用graphviz的dot引擎来渲染树(遵循this recommendation)。我想通过指定应该具有相同高度的节点来控制节点的y位置。这些节点可能位于树的不同深度。
我知道如果我编写自己的graphviz代码并使用
rank=same
命令(例如,{rank=same; n4 -> p2;}
[ex.]),我可以控制节点高度。但是,我依赖于networkx.graphviz_layout() [doc | source]生成节点位置,而graphviz_layout只能向pygraphviz发送命令行参数。我尝试使用nx.graphviz_layout(G, prog='dot', args="-Grank=same; n4 -> p2;")
的变体,但失败了。如何在NetworkX包装器中描述所需的节点高度?或者我需要编写自己的pygraphviz包装器吗?编辑:答案提供了一个新的pygraphviz包装器。如果有人能告诉我如何在现有的NetworkX pygraphviz包装器中发送排名信息,那将极大地简化事情。