我不知道如何对根树中相同深度的节点强制执行顺序。它曾在this thread中被提出,但没有得到解决。问题是,正如问题的作者所说,graphviz(至少是graphviz的python库)无法维护创建顺序。你知道吗
例如:
g = Graph(format="png")
g.node("x", shape="doublecircle")
g.node("y", shape="circle") # removed in graph 2
g.node("z", shape="circle") # removed in graph 2
g.node("nil1", shape="none", label="NIL")
g.node("nil2", shape="none", label="NIL")
g.edge("x", "nil1")
g.edge("x", "y")
g.edge("y", "z")
g.edge("y", "nil2")
上面的代码在我的计算机上生成这个图形
如您所见,y节点和nil1节点交换了位置,但它们不应该交换
但是在我从上面的代码中删除了第3行和第4行之后,输出发生了变化!
这太好笑了。我不知道为什么删除定义两个节点及其形状的两行可以更改输出。即使这两行确实影响了输出,但预期的输出与两个生成的输出中的任何一个都是不同的。你知道我的代码出了什么问题吗?你知道吗
在同一列上,Graphviz按节点定义的顺序绘制节点。在
TB
(从上到下)中,相同列上的布局节点按从左到右的顺序绘制。你知道吗在您的情况下,如果希望
nil1
节点出现在y
节点的之前(左侧),则必须在之前定义它。与z
和nil2
相同。你知道吗这应该起作用:
为了澄清,这里有一个基本的例子。你知道吗
在这里,我们按照字母顺序定义了节点,因此我们将得到图上相同的顺序:
如果我们颠倒顺序:
图表上的顺序也将颠倒:
回答为什么删除节点定义会影响顺序的问题。如果不需要特殊属性,实际上可以省略定义节点。在这种情况下,当graphviz看到带有未定义节点的edge语句时,它将隐式添加节点定义,例如:
也就是说:
因此,在您的例子中,从一开始就删除
y
和z
的定义会使它们出现得更晚,就在它们的边缘定义之前。它隐式地将nil1
和nil2
定义放在y
和z
之上。这与我在开始时建议的显式解决方案具有相同的效果。你知道吗相关问题 更多 >
编程相关推荐