Ale*_*nov 3 python graph graphviz rank
我一直在寻找在python中的graphviz中指定图中节点位置的方法。我在点中找到了一个子图的等级命令,这就是我想要的,但是我找不到在python中的graphviz中组合子图和等级的方法。我也尝试强行设置节点位置,但也没有用。我创建了一个想要实现的简单示例。
这是我的代码:
from graphviz import Digraph
top_nodes = ['a', 'b', 'c']
other_nodes = ['d', 'e', 'f', 'g', 'm', 'n']
g = Digraph('test', format='png')
for n in top_nodes:
g.node(str(n), color='red')
for n in other_nodes:
g.node(str(n))
g.edge('a', 'd')
g.edge('d', 'g')
g.edge('g', 'm')
g.edge('m', 'n')
g.edge('b', 'e')
g.edge('b', 'f')
g.edge('e', 'n')
g.edge('c', 'f')
g.view()
Run Code Online (Sandbox Code Playgroud)
这是输出:

我希望红色节点(“源”)位于同一级别的图形顶部,其他节点的位置并不重要,只要保留层次结构即可。
小智 5
我遇到了同样的问题,并发现使用子图可以解决该问题。
from graphviz import Digraph
top_nodes = ['a', 'b', 'c']
other_nodes = ['d', 'e', 'f', 'g', 'm', 'n']
g = Digraph('test', format='png')
s = Digraph('subgraph')
s.graph_attr.update(rank='min')
for n in top_nodes:
s.node(str(n), color='red')
for n in other_nodes:
g.node(str(n))
g.edge('a', 'd')
g.edge('d', 'g')
g.edge('g', 'm')
g.edge('m', 'n')
g.edge('b', 'e')
g.edge('b', 'f')
g.edge('e', 'n')
g.edge('c', 'f')
g.subgraph(s)
g.view()
Run Code Online (Sandbox Code Playgroud)