【问题标题】:Node placement in networkxnetworkx中的节点放置
【发布时间】:2014-09-13 13:35:47
【问题描述】:

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

举几个互联网上的例子:我查看了its official site和来自networkx的教程 this site。 我也看到了一些这样的问题 this, this 和 this。 他们在一定程度上帮助了我,但我无法得到我真正想要的东西。 我还检查了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()

【问题讨论】:

    标签: python graphviz networkx


    【解决方案1】:

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

    只有当你移动根节点或当图形结构/形状定义改变时,终端节点才会改变。

    在您的示例中,考虑到以节点“O”为根的图定义,图论暗示只有“F”和“G”节点是终端..

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

    您可能会尝试获取顶部底部终端节点的“y 位置”值(在您的示例节点“F”中),然后强制您“认为”为终端的所有其他节点的“y 位置”(在您的示例中 ['B', 'D', 'F', 'H']) 到相同的位置。

    或

    您可以将图形布局更改为spring layout,并强制(通过在加载时指定)所有节点的“x-y 位置”。

    最好的问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 2012-12-03
      • 2017-10-09
      • 1970-01-01
      • 2020-08-16
      • 2015-01-17
      • 1970-01-01
      相关资源
      最近更新 更多