【问题标题】:How to avoid Graphviz dot layouts wasting space, with nodes of disparate sizes at the same rank?如何避免 Graphviz 点布局浪费空间,不同大小的节点在同一等级?
【发布时间】:2018-05-30 17:36:04
【问题描述】:

当一个人有一个最适合使用点排列的 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 dot


    【解决方案1】:

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

    或者只为部分指定constraint属性。


    编辑:我们可以借助子图获得相当接近的结果:

    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”样式图,并以这种方式生成具有相同等级的节点的垂直子部分。现在,这在这个简单的示例中运行良好,但是它确实限制了节点在列中垂直对齐。我认为这种方法不能很好地推广到具有更多分支的较大图表,我将为此处理。谢谢
    猜你喜欢
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多