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))
如何确保节点按照它们在我的源代码中定义的顺序呈现?在我的代码中,我首先定义了节点 '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))