Python Pygraphviz/networkx设置节点级别或层

Python Pygraphviz/networkx设置节点级别或层,python,graphviz,networkx,pygraphviz,data-representation,Python,Graphviz,Networkx,Pygraphviz,Data Representation,我有一个数据集,它表示一种系谱树。每个节点有2个父节点(除第一代外,它们没有父节点)。对于给定节点,其父节点可以来自任何上一代。例如,n代中的节点可以在n-1中有一个父节点,在n-5中有另一个父节点。一个节点可以是其他几个节点的父节点 所以基本上,对于每个节点,我都知道它的生成和它的父节点 我试图表示这个图,使来自同一代的节点保持在同一条线上。除第一代外,每代有10个节点 到目前为止,我正在尝试“点”布局。当我只输入两代时,它做得很好,但当我输入三代时,它“太聪明了”,并以某种方式重新排列节点

我有一个数据集,它表示一种系谱树。每个节点有2个父节点(除第一代外,它们没有父节点)。对于给定节点,其父节点可以来自任何上一代。例如,n代中的节点可以在n-1中有一个父节点,在n-5中有另一个父节点。一个节点可以是其他几个节点的父节点

所以基本上,对于每个节点,我都知道它的生成和它的父节点

我试图表示这个图,使来自同一代的节点保持在同一条线上。除第一代外,每代有10个节点

到目前为止,我正在尝试“点”布局。当我只输入两代时,它做得很好,但当我输入三代时,它“太聪明了”,并以某种方式重新排列节点

例如,以下数据表示3代:

[(ObjectId('530B2AD783A115E695C9711')、ObjectId('530B804883A15E695C972B')、ObjectId('530B2AD783A115E695C971C')、ObjectId('530B804883A15E695C972B')、ObjectId('530B804883A15E695C9727')、ObjectId('530B2AD783A115E695C970A')、ObjectId('530B4883A15E695E695C9727')、'('530B2AD783A1A115E695C970B')、ObjectId('530B804883A15E695C9724')、ObjectId('530B2AD783A115E695C970F')、ObjectId('530B804883A15E695C9724')、ObjectId('530B804883A15E695C9729')、ObjectId('530B2AD783A115E695C970E')、ObjectId('530B804883A115E695E695C9711')、ObjectId(',ObjectId('530B804883A15E695C9723'),(ObjectId('530B2AD783A115E695C970E'),(ObjectId('530B804883A15E695C9723'),(ObjectId('530B2AD783A115E695C971C'),(ObjectId('530B2AD783A115E695C9719'),ObjectId('530B804883A15E695C9728'),(ObjectId('530B804883A15E695E695C9714'),(ObjectId('530B2AD783A115E695C9726'))),(ObjectId('530B2AD783A115E695C9713')、ObjectId('530B804883A15E695C9726')、(ObjectId('530B2AD783A115E695C9716')、ObjectId('530B804883A15E695C9722')、(ObjectId('530B2AD783A115E695C9719')、ObjectId('530B804883A15E695C9722')、(ObjectId('530B2AD783A115E695E695C9725')、'('530B2AD783A1A115E695C9715')、ObjectId('530B804883A15E695C9725')、(ObjectId('530B804883A15E695C9724')、ObjectId('530BA27C83A15E695C972D')、(ObjectId('530B2AD783A115E695C9713')、ObjectId('530BA27C83A15E695C972D')、(ObjectId('530B804883A15E695E695C9724')、ObjectId('530BA27C83A15E695E695C972E')、'AD979')),ObjectId('530BA27C83A15E695C972E'),(ObjectId('530B804883A15E695C9727'),(ObjectId('530BA27C83A15E695C972F'),(ObjectId('530B2AD783A115E695C9709'),(ObjectId('530BA27C83A15E695C9713'),(ObjectId('530BA27C83A15E695C9730')),(ObjectId('530BA27C781A15E695E695C9730')),(ObjectId('530BA27A781A15E695E695C9730'))),(ObjectId('530B2AD783A1A115E695C9713')、ObjectId('530BA27C83A15E695C9731')、ObjectId('530B804883A15E695C9725')、ObjectId('530BA27C83A15E695C9731')、ObjectId('530B804883A15E695C9722')、ObjectId('530BA27C83A15E695C9732')、ObjectId('530B2AD781A15E695E695C9732')、ObjectId('530BA804883A15E695C9732')、'('530B2AD783A1A115E695C9711')、ObjectId('530BA27C83A15E695C9733')、ObjectId('530B2AD783A115E695C971F')、ObjectId('530BA27C83A15E695C9733')、ObjectId('530B804883A15E695C972B')、ObjectId('530BA27C83A15E695C9734')、ObjectId('530B2AD783A115E695C9713')、ObjectId('530BA27C83A15E695E695C9734')、ObjectId(',ObjectId('530BA27C83A15E695C9735'),(ObjectId('530B804883A15E695C9724'),(ObjectId('530BA27C83A15E695C9735'),(ObjectId('530B2AD783A115E695C9713'),ObjectId('530BA27C83A15E695C9736'),(ObjectId('530B804883A15E695C9723'),ObjectId('530BA27C83A15E695E695C9736'),(ObjectId('530B2AD781A15E695C9716'),(ObjectId('530B781A15E695E6922'))),(ObjectId('530B2AD783A115E695C9719')、ObjectId('530B804883A15E695C9722')、(ObjectId('530B2AD783A115E695C9711')、ObjectId('530B804883A15E695C9723')、(ObjectId('530B2AD783A115E695C970E')、ObjectId('530B804883A15E695C9723')、(ObjectId('530B2AD783A115E695E695C970B')、ObjectId('530B48A83A15E695E695C9724'))、(ObjectId))('530B2AD783A1A115E695C970F')、ObjectId('530B804883A15E695C9724')、ObjectId('530B2AD783A115E695C970D')、ObjectId('530B804883A15E695C9725')、ObjectId('530B804883A15E695C9725')、ObjectId('530B2AD783A115E695C9714')、ObjectId('530B804883A115E695C9726')、ObjectId('530B8048831A15E695C9713')),ObjectId('530B804883A15E695C9726'),(ObjectId('530B2AD783A115E695C9709'),(ObjectId('530B804883A15E695C9727'),(ObjectId('530B2AD783A115E695C970A'),(ObjectId('530B2AD783A115E695C971C'),(ObjectId('530B804883A15E695C9728'),(ObjectId('530B2AD783A115E695E695C9728'),'530B804883A115E695C9728'))),(ObjectId('530B2AD783A115E695C9714')、ObjectId('530B804883A15E695C9729')、ObjectId('530B2AD783A115E695C970E')、ObjectId('530B804883A15E695C9729')、ObjectId('530B804883A15E695C972A')、ObjectId('530B2AD783A115E695C970B')、ObjectId('530B4883A15E695E695C972A')、ObjectId('530B48AD781A15E695E695C972A')、'('530B2AD783A1A115E695C9711')、ObjectId('530B804883A15E695C972B')、(ObjectId('530B2AD783A1A115E695C971C')、ObjectId('530B804883A15E695C972B'))]

产生:

例如,所有“根”节点(因此不接收边)都应放置在第一行上,但它会将其中一些节点放置在第二级上

一旦我尝试用10代制作更大的图形,所有的层次结构就毫无意义了

是否有任何参数或方法来指定节点的级别或层?在我提供的数据中,信息不存在,但我可以很容易地生成它,问题是我不知道如何将该信息发送到pygraphviz或networkx

我还想用这些数据生成带有twopi l的图
import networkx as nx
import pygraphviz as pgv # pygraphviz should be available

G = nx.DiGraph()
G.add_edge('a','aa')
G.add_edge('a','ab')
G.add_edge('a','bbc')
G.add_edge('b','ab')
G.add_edge('b','bb')
G.add_edge('c','bbc')
G.add_edge('bb','bba')
G.add_edge('bb','bbc')
A = nx.to_agraph(G)
one = A.add_subgraph(['a','b','c'],rank='same')
two = A.add_subgraph(['aa','ab','bb'],rank='same')
three = A.add_subgraph(['bba','bbc'],rank='same')
A.draw('example.png', prog='dot')