在Graphviz中将集群放在相同的排名上

tin*_*com 31 graphviz

我希望这两个节点出现在同一级别:

在此输入图像描述

digraph G {
    subgraph cluster1 {
        label="Local Datacenter";
        router1;
        host1;
    }
    subgraph cluster2 {
        label="Remote Datacenter";
        router2;
        host2;
    }
    router1 -> router2;
    router2 -> host2;
    router1 -> host1;
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用rank=samerank=min,但他们不给我我需要什么.

有趣的是,如果我设置rankdir=LR并注释掉两个路由器到主机的边缘,它会给我我想要的外观 - 但我想保持边缘不变.

dub*_*bek 59

您可以使用(未​​记录的?)newrank图形属性(在GraphViz 2.30中添加)来激活新的排名算法,该算法允许定义rank=same属于集群的节点.

在顶部添加以下行:

newrank=true;
Run Code Online (Sandbox Code Playgroud)

在群集定义添加以下行:

{ rank=same; router1; router2; }
Run Code Online (Sandbox Code Playgroud)

这是结果图:

排名相同的路由器

  • 这个未记录的`newrank`事情也解决了我(相关但不同)的问题 - 尝试通过在集群中的节点之间放置一个不可见的边缘来获得点以将集群放在不同的行上.没有`newrank`,这按预期工作...*提供*你定义"普通"子图(其名称不以"cluster"开头).如果你使它们成为簇,突然dot不介意在同一级别的节点之间有边缘!啊. (7认同)
  • 这比 `constraint=false` 方法更直观,并且具有可预测的结果。谢谢你。 (2认同)
  • `constraint = false` 不适用于大图。它把它放在西伯利亚的某个地方,而不是紧挨着它。 (2认同)

mar*_*pet 32

您可以简单地修改路由器之间的边缘:

router1 -> router2[constraint=false];
Run Code Online (Sandbox Code Playgroud)

constraint 指示是否应该在节点的排名中使用边缘.