如何避免Graphviz点布局浪费空间,使大小不同的节点处于同一列?

如何避免Graphviz点布局浪费空间,使大小不同的节点处于同一列?,graphviz,dot,Graphviz,Dot,当有一个graphviz有向图最适合使用点进行排列时,有没有办法绕过大节点在相同秩的其他节点周围创建多余填充的问题 例如,使用以下图表: digraph { b[label="line 1\nline 2\nline 3\nline 4\nline 5\nline 6\n"]; a -> b; a -> c; b -> f; c -> d; d -> e; e -> f; } 由于左侧路径增加了列组

当有一个graphviz有向图最适合使用点进行排列时,有没有办法绕过大节点在相同秩的其他节点周围创建多余填充的问题

例如,使用以下图表:

digraph {
    b[label="line 1\nline 2\nline 3\nline 4\nline 5\nline 6\n"];

    a -> b;
    a -> c;
    b -> f;
    c -> d;
    d -> e;
    e -> f;
}

由于左侧路径增加了列组的高度(在右侧路径中不需要如此高),因此该图明显高于所需高度

是否有一种方法可以分别布置这两条路径?我认为使用集群子图可能会有所帮助,但即使在这种情况下,排名高度似乎也是完全全局的

我希望得到类似于此图像编辑的结果(请原谅它粗糙):

作为一种解决方法,您可以尝试添加
边[constraint=false]
这将为所有边设置属性值:

或者仅为某些边指定
约束
属性


编辑:借助子图,我们可以获得非常接近的结果:

digraph {

    rankdir = LR;

    b[label="line 1\nline 2\nline 3\nline 4\nline 5\nline 6\n"];

    subgraph cluster_0 {

        rank = same;

        style = invis;

        a -> c -> d -> e -> f [constraint = false];

    }

    a -> b;
    b -> f;

}
将按如下方式呈现:


不幸的是,这根本不能满足我的要求。这只会导致将所有节点移动到同一列,而我需要的是,从节点“a”到节点“f”的两条路径仍然在垂直方向并排,但节点“b”的高度不会增加另一条路径上的填充。我已经编辑了这个问题以包含一幅清晰的图片。@Rednaxela我已经更新了答案,新的结果看起来与你的第二幅插图非常相似。啊,很有趣。这很聪明,使用“rankdir=LR”样式的图形,并以这种方式生成具有相同列节点的垂直子部分。现在,在这个简单的示例中,这已经足够好了,但是它确实限制了节点在列中垂直对齐。由于这个原因,我认为这种方法不能很好地推广到具有更多分支的大型图。不过,谢谢