python: graphviz 中的 rank 属性以对齐节点

python: rank attribute in graphviz to align nodes

我正在尝试使用 'rank' 属性让我的节点在 graphviz 中对齐,但我没有得到想要的结果。我在 jupyter 笔记本中使用 graphviz。这是我的代码:

import graphviz
from IPython.display import display

p = graphviz.Digraph(graph_attr={'rankdir':'LR'}, format='png')
p.node('A')
p.node('B')
p.node('D')
p.node('E')
p.node('F')
p.edges(['AB','BD', 'DE', 'EF'])

c = graphviz.Digraph(name='child',
                     graph_attr={'rankdir':'LR', 'rank':'min'},
                     node_attr={'shape': 'box'})

c.node('C')
c.edges(['AC', 'CD'])

p.subgraph(c)

p.render('p.gv', view=False)

with open("p.gv") as f:
    dot_graph = f.read()
    display(graphviz.Source(dot_graph))

所以我想要实现的是让节点 'A'、'B'、'D'、'E' 和 'F' 都在同一行从左到右对齐,然后节点 'C' 直接位于节点 'B' 上方。我嵌入了一个图像,它显示了我的代码当前状态的输出。根据图像,我想以节点 'D' 为旋转轴,将节点 'A'、'B' 和 'C' 逆时针旋转 90 度。然后,一旦完成,我想切换节点 'B' 和 'C'

的位置

希望有人能帮帮我。

谢谢

无法提供 Python 版本,但这里是普通的 Graphviz。诀窍是 rank=same

digraph D {
  //   rankdir=LR //  nope
  C[shape=rect]
  {rank=same  // this puts all 5 nodes on same rank
  A->B  
  B->D
  D->E
  E->F
  }
  A->C->D  
}

给予:

感谢@sroush,我能够基于@sroush 提供的 Graphviz 代码构建 Python 代码。

import graphviz
from IPython.display import display

p = graphviz.Digraph(format='png')
p.node('C', shape='box')

c = graphviz.Digraph(graph_attr={'rank':'same'})
c.node('A')
c.node('B')
c.node('D')
c.node('E')
c.node('F')
c.edges(['AB','BD', 'DE', 'EF'])
p.edges(['AC', 'CD'])

p.subgraph(c)

p.render('j.gv', view=False)

with open("j.gv") as f:
    dot_graph = f.read()
    display(graphviz.Source(dot_graph))