【发布时间】:2020-08-16 11:47:00
【问题描述】:
我有树状图,看起来像带有树枝的长树干,每个树枝上都可以有“叶子”。它看起来基本上像(边缘没有图片):
o
oo
oo o
o o o
oooooooooooooooooooooooooo
o
o
树干的长度可以是任意的,每个垂直分支有十个节点,叶子最多只有一个节点。主干的每个节点最多有 4 条边。由于保证垂直的“叶子”永远不会重叠,我希望能够转换一个图形,使每个节点都在一个格子上,并获得一个形式的字典
dict = {n1: (x1, y2), n2: (x2, y2), ...}
ni 是节点 ID,(xi, yi) 是一对整数,表示格子上的位置。我尝试通过使用图G的所有节点之间的最大距离获取主干来自己实现它:
nodeList = list(G.nodes)
dic = {}
for i, n1 in enumerate(nodeList):
for n2 in nodeList[i+1:]:
dic[(n1, n2)] = networkx.shortest_path(G,source=n1,target=n2)
dicLength = {k: len(dic[k]) for k in dic}
k = max(dicLength, key=dicLength.get)
trunk = dic[k]
然后我可以将树干设置为格子的 x 坐标:
lattice = {k: (i, 0) for i, k in enumerate(trunk)}
然后我尝试通过检查树干中的一个节点是否有两个以上的邻居来计算垂直分支,并从那里从一个节点迭代到另一个节点,但是在遇到叶子时我遇到了麻烦。此外,它不适用于大型树干。
networkx 有没有更简单的方法来做到这一点?
编辑:一个最小的例子是:
G = nx.path_graph(10)
G.add_edges_from([(3,11),(11,12),(12,13),(13,14),(13,15),(1,16)])
【问题讨论】:
标签: python graph nodes networkx