python: graphviz -- 如何指定节点渲染顺序

python: graphviz -- how to specify node render order

如何确保节点按照它们在我的源代码中定义的顺序呈现?在我的代码中,我首先定义了节点 'A',因此希望它会呈现在图形的 'top' 处,然后三个 'child class' 节点会出现在它下面(所有在一行中,因为它们在嵌入图像中)。但从嵌入图像中可以看出,情况恰恰相反。我在 Jupyter Notebook 中使用 Python 3.7.12。

from IPython.display import display
import graphviz

p = graphviz.Digraph(node_attr={'shape':'box'},format='png')

p.node(name='A', label='parent class')

with p.subgraph() as s:
    s.attr(rank='same')
    s.node(name='B', label='child class 1')
    s.node(name='C', label='child class 2')
    s.node(name='D', label='child class 3')

p.edges(['BA', 'CA', 'DA'])

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

with open('a.gv') as f:
    dot = f.read()
    display(graphviz.Source(dot))

有人知道如何解决这个问题吗?

好的,我只需要将 'rankdir' 图形属性设置为 'BT',我认为这意味着 'bottom-top'

这是更新后的代码:

from IPython.display import display
import graphviz

p = graphviz.Digraph(graph_attr={'rankdir':"BT"},
                     node_attr={'shape':'box'},
                     format='png')

p.node(name='A', label='parent class')

with p.subgraph() as s:
    s.attr(rank='same')
    s.node(name='B', label='child class 1')
    s.node(name='C', label='child class 2')
    s.node(name='D', label = 'child class 3')

p.edges(['BA', 'CA', 'DA'])

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

with open('a.gv') as f:
    dot = f.read()
    display(graphviz.Source(dot))