Graphviz:如何获得固定的节点位置
Graphviz: How to get fixed node positions
我是 Graphviz 的新手,如果我的问题太幼稚,请见谅。
在 dot 中,我尝试制作几张图形图像,节点位于固定位置,但弧线不同。然而,即使是弧形配置的微小修改,也会在布局上产生巨大差异。我找到了一些解决方法(通过将某些对冲保持为不可见,或使用 "back" 选项)。但是,我想知道是否有更优雅的方法来避免这种情况,即只修改一个弧线方向就会给出完全不同的布局。
例如,看这个:
digraph exempleUPFM {
label=mylab;
ratio = 0.5;
spline = line; forcelabels=true;
node [shape = circle;style=filled; color=lightgrey;];
1 [xlabel="10" fontcolor= blue group=g1];
4 [xlabel="-6" fontcolor= red group=g1];
2 [xlabel="4" fontcolor= blue group=g2];
5 [xlabel="-8" fontcolor= red group=g2];
node [shape = circle; style=""]
{rank=same; 1 2}
{rank=same; 4 5}
1 -> 2 [label=" 1"]
1 -> 3 [label=" 8"]
1 -> 4 [label=" 1"]
2 -> 3 [label=" 2"]
3 -> 4 [label=" 1"]
3 -> 5 [label=" 4"]
4 -> 5 [label=" 12"]
5 -> 2 [label=" -7"]
}
或这个
digraph exemple2UPFM {
label=mylab;
ratio = 0.5;
spline = line; forcelabels=true;
node [shape = circle;style=filled; color=lightgrey;];
1 [xlabel="10" fontcolor= blue group=g1];
4 [xlabel="-6" fontcolor= red group=g1];
2 [xlabel="4" fontcolor= blue group=g2];
5 [xlabel="-8" fontcolor= red group=g2];
node [shape = circle; style=""];
{rank=same; 1 2}
{rank=same; 4 5}
1 -> 2 [label=" 1"]
1 -> 3 [label=" 8"]
1 -> 4 [label=" 1"]
2 -> 3 [label=" 2"]
3 -> 4 [label=" 1"]
3 -> 5 [label=" 4"]
5 -> 4 [label="-12"]
5 -> 2 [label=" -7"]
}
在这个具体案例中,唯一的区别是 5 和 4 之间的弧线方向。但是图形布局的差异是残酷的。在第二个示例中,如果我保留弧线 4 -> 5 并添加 "back" 选项,布局将恢复为原始布局。
你知道为什么会这样吗,是否有办法避免节点的位置在任何最小弧度修改时发生变化?
非常感谢您的帮助。
graphviz
不知道你想要图表的样子。它会按照您给出的说明计算出来。在默认布局(从上到下)中,当您说 A -> B
时,它会将第一个节点放在第二个节点的顶部,如果它们的级别相同,则会将第一个节点放在第二个节点的左侧。如果您查看 "brutally" 更改后的布局,您会发现其中的逻辑。
因此,如果您想保留第一个列表的节点排列,在这两种情况下都说 2 -> 5[ dir = back ]
是更安全的选择,4 -> 5[ dir = back ]
应该不足为奇。如果您牢记 graphviz
' 逻辑,在大多数情况下您应该能够对布局进行排序。不可见的节点和边,或者给边增加权重是下一个级别。
举例说明:
digraph exempleSO
{
label=mylab;
ratio = 0.5;
spline = line;
forcelabels=true;
node [shape = circle;style=filled; color=lightgrey;];
1 [xlabel="10" fontcolor= blue group=g1];
4 [xlabel="-6" fontcolor= red group=g1];
2 [xlabel="4" fontcolor= blue group=g2];
5 [xlabel="-8" fontcolor= red group=g2];
node [shape = circle; style=""]
{rank=same; 1 2}
{rank=same; 4 5}
1 -> 2 [label=" 1"]
1 -> 3 [label=" 8"]
1 -> 4 [label=" 1"]
2 -> 3 [label=" 2"]
3 -> 4 [label=" 1"]
3 -> 5 [label=" 4"]
4 -> 5 [dir = back, label=" 12 back"]
2 -> 5 [dir = back, label=" -7 back"]
}
产量
我是 Graphviz 的新手,如果我的问题太幼稚,请见谅。
在 dot 中,我尝试制作几张图形图像,节点位于固定位置,但弧线不同。然而,即使是弧形配置的微小修改,也会在布局上产生巨大差异。我找到了一些解决方法(通过将某些对冲保持为不可见,或使用 "back" 选项)。但是,我想知道是否有更优雅的方法来避免这种情况,即只修改一个弧线方向就会给出完全不同的布局。
例如,看这个:
digraph exempleUPFM {
label=mylab;
ratio = 0.5;
spline = line; forcelabels=true;
node [shape = circle;style=filled; color=lightgrey;];
1 [xlabel="10" fontcolor= blue group=g1];
4 [xlabel="-6" fontcolor= red group=g1];
2 [xlabel="4" fontcolor= blue group=g2];
5 [xlabel="-8" fontcolor= red group=g2];
node [shape = circle; style=""]
{rank=same; 1 2}
{rank=same; 4 5}
1 -> 2 [label=" 1"]
1 -> 3 [label=" 8"]
1 -> 4 [label=" 1"]
2 -> 3 [label=" 2"]
3 -> 4 [label=" 1"]
3 -> 5 [label=" 4"]
4 -> 5 [label=" 12"]
5 -> 2 [label=" -7"]
}
或这个
digraph exemple2UPFM {
label=mylab;
ratio = 0.5;
spline = line; forcelabels=true;
node [shape = circle;style=filled; color=lightgrey;];
1 [xlabel="10" fontcolor= blue group=g1];
4 [xlabel="-6" fontcolor= red group=g1];
2 [xlabel="4" fontcolor= blue group=g2];
5 [xlabel="-8" fontcolor= red group=g2];
node [shape = circle; style=""];
{rank=same; 1 2}
{rank=same; 4 5}
1 -> 2 [label=" 1"]
1 -> 3 [label=" 8"]
1 -> 4 [label=" 1"]
2 -> 3 [label=" 2"]
3 -> 4 [label=" 1"]
3 -> 5 [label=" 4"]
5 -> 4 [label="-12"]
5 -> 2 [label=" -7"]
}
在这个具体案例中,唯一的区别是 5 和 4 之间的弧线方向。但是图形布局的差异是残酷的。在第二个示例中,如果我保留弧线 4 -> 5 并添加 "back" 选项,布局将恢复为原始布局。
你知道为什么会这样吗,是否有办法避免节点的位置在任何最小弧度修改时发生变化?
非常感谢您的帮助。
graphviz
不知道你想要图表的样子。它会按照您给出的说明计算出来。在默认布局(从上到下)中,当您说 A -> B
时,它会将第一个节点放在第二个节点的顶部,如果它们的级别相同,则会将第一个节点放在第二个节点的左侧。如果您查看 "brutally" 更改后的布局,您会发现其中的逻辑。
因此,如果您想保留第一个列表的节点排列,在这两种情况下都说 2 -> 5[ dir = back ]
是更安全的选择,4 -> 5[ dir = back ]
应该不足为奇。如果您牢记 graphviz
' 逻辑,在大多数情况下您应该能够对布局进行排序。不可见的节点和边,或者给边增加权重是下一个级别。
举例说明:
digraph exempleSO
{
label=mylab;
ratio = 0.5;
spline = line;
forcelabels=true;
node [shape = circle;style=filled; color=lightgrey;];
1 [xlabel="10" fontcolor= blue group=g1];
4 [xlabel="-6" fontcolor= red group=g1];
2 [xlabel="4" fontcolor= blue group=g2];
5 [xlabel="-8" fontcolor= red group=g2];
node [shape = circle; style=""]
{rank=same; 1 2}
{rank=same; 4 5}
1 -> 2 [label=" 1"]
1 -> 3 [label=" 8"]
1 -> 4 [label=" 1"]
2 -> 3 [label=" 2"]
3 -> 4 [label=" 1"]
3 -> 5 [label=" 4"]
4 -> 5 [dir = back, label=" 12 back"]
2 -> 5 [dir = back, label=" -7 back"]
}
产量