networkx中的节点位置

时间:2014-07-22 16:04:00

标签: python graphviz networkx

我正在尝试使用包networkx绘制图表。 在我的图中,我知道哪个节点是根节点,哪个节点是终端节点。 我希望我的图形是垂直构造的,并希望将根节点放在图形的顶部。因此,我想将终端节点放在底部。无论图形的边缘如何,我都希望将其保留在绘制的任何图形上。其间的节点可以任意放置(但在垂直方向,取决于它们的等级)。

在互联网上列出几个示例:我在its official site和来自this site的网络上检查了教程 this。 我也看到了一些SO问题 thisthisPyGraphwiz。 他们在一定程度上帮助了我,但我无法得到我真正想要的东西。 我还检查了{{3}} 要了解是否可以通过创建'.dot'文件来实现这样的节点安排,但我无法取得任何进展。

我绘制的图表及其代码如下。可以看出,没有任何行或标记定义哪个节点是根节点,哪些节点是终端。

graph drawn using the code below


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 :(得分:0)

定向图本身的结构定义定义了所有终端节点,

只有在图形结构/形状定义更改时移动根节点时,终端节点才会更改。

在您的示例中,考虑使用节点' O'作为根,图论暗示只有' F' &安培; ' G'节点终端..

另一方面,如果你最终不想修复/破解图表的图形渲染:

您可能会尝试获得&#34; y位置&#34;顶部底部终端节点的值(在您的示例节点中&#39; F&#39;),然后强制&#34; y位置&#34;您考虑过的所有其他节点#34;作为终端(在您的示例中[&#39; B&#39;,&#39; D&#39;,&#39; F&#39;,&#39; H&#39;])到同一位置。< / p>

您可以将图表布局更改为spring layout,并强制(通过指定加载时)&#34; x-y位置&#34;所有节点。

祝你好运