networkx中的节点放置

0 投票
1 回答
1520 浏览
提问于 2025-04-18 14:17

我正在尝试使用 networkx 这个工具来绘制图形。在我的图中,我知道哪个节点是根节点,哪些节点是终端节点。我希望我的图是垂直的,并且想把根节点放在图的顶部。相应地,我希望把终端节点放在底部。不管图的边是怎样的,我希望这个结构在任何绘制的图中都能保持。中间的节点可以随意放置,但要根据它们的等级在垂直方向上排列。

关于网上的一些例子:我查看了 networkx的官方网站这个网站上的教程。我还看到了一些StackOverflow上的问题,比如 这个, 这个这个。 这些对我有一定帮助,但我还是没能实现我想要的效果。我还查看了 PyGraphwiz,想看看是否可以通过创建 '.dot' 文件来实现这样的节点排列,但我没有取得任何进展。

下面是我绘制的图和相应的代码。从图中可以看出,没有任何线条或标记来定义哪个节点是根节点,哪些是终端节点。

使用下面的代码绘制的图


import networkx as nx
import matplotlib.pyplot as plt

graph = [('O', 'A'), ('O', 'C'),  ('O', 'E'),  ('O', 'G'),  ('O', 'H'),  
         ('A', 'B'), ('A', 'O'),
         ('B', 'A'),
         ('C', 'D'), ('C', 'E'), ('C', 'F'), ('C', 'O'),
         ('D', 'E'), ('D', 'C'), ('D', 'F'),  
         ('E', 'C'), ('E', 'D'), ('E', 'F'), ('E', 'O'),
         ('F', 'C'), ('F', 'D'), ('F', 'E'),
         ('G', 'H'), ('G', 'O'), 
         ('H', 'G'), ('H', 'O')]

root_node = 'O'
terminal_nodes = ['B', 'D', 'F', 'H']

G=nx.DiGraph()
for edge in graph:
    G.add_edge(edge[0], edge[1])

pos=nx.graphviz_layout(G,prog='dot')
nx.draw(G, pos, arrows=False)
plt.show()

1 个回答

0

这是有向图的结构定义,它决定了所有的终端节点。

终端节点只有在你移动根节点或者图的结构/形状发生变化时才会改变。

在你的例子中,假设节点'O'是根节点,根据图论的说法,只有'F'和'G'节点终端节点。

另一方面,如果你只是想修复或调整图形的显示:

你可以尝试获取最底部终端节点的“y坐标”值(在你的例子中是节点'F'),然后强制所有你认为是终端的其他节点(在你的例子中是['B', 'D', 'F', 'H'])的“y坐标”都设置为这个值。

或者

你可以将图的布局改为弹簧布局,并在加载时强制指定所有节点的“x-y坐标”。

祝好

撰写回答