networkx中的节点放置
我正在尝试使用 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坐标”。
祝好