【问题标题】:Clusters in Graphviz won't space symmetricallyGraphviz 中的集群不会对称分布
【发布时间】:2015-05-05 21:27:37
【问题描述】:

我试图让多个节点集群在 Graphviz 中均匀分布。

我认为这张图片最能说明我想要做什么:

从图中可以看出,第2层和第3层之间有额外的间距。2和3之间的间距应该与1和2之间的间距相同。

间距也需要缩放超过 3 层。当我尝试超过 3 层时,第 4 层的间距与第 3 层一样差。

这是我的图表文件:

digraph G {
    nodesep=1.25;
    splines=false;

    node[width=1, shape=circle];
    edge[style=invis];

    subgraph cluster_1 {
        label="Layer 1";
        "1-1" -> "1-2" -> "1-3";
    }

    subgraph cluster_2 {
        label="Layer 2";
        "2-1" -> "2-2" -> "2-3";
    }

    subgraph cluster_3 {
        label="Layer 3";
        "3-1" -> "3-2" -> "3-3";
    }

    edge[style=solid, penwidth=1, constraint=false];

    "1-1" -> "2-1";
    "1-3" -> "2-1";

    "1-1" -> "2-2";
    "1-2" -> "2-2";

    "1-2" -> "2-3";
    "1-3" -> "2-3";

    "2-1" -> "3-1";
    "2-3" -> "3-1";

    "2-1" -> "3-2";
    "2-2" -> "3-2";

    "2-2" -> "3-3";
    "2-3" -> "3-3";

}

我怎样才能让我的间距对称?任何帮助将非常感激。谢谢。

更新: 我设法使间距均匀,但这不是一个完美的解决方案。

通过在图形上方放置一个带有不可见边的不可见节点并将其连接到每一层的顶部节点,这些层的空间均匀。但是,此节点会弄乱需要在所示图像上方添加的内容的间距。那么,有没有更好的方法来做到这一点?

【问题讨论】:

  • 我认为您在布局引擎中发现了一个错误。额外的空间出现在带有样条线的边缘"x-3" -> "y-1" 将围绕节点"y-2" 路由。
  • @stefan 没有容器,布局引擎没有理由假设相等的间距很重要(这并不是说它不应该被编程这样做)。将集群嵌套在另一个集群中会导致布局引擎将它们平均间隔开。请参阅下面我的答案中的代码。
  • @benrudgers:有或没有“容器”的(不存在)推理是相同的。相等的间距只是偶然的,外部集群中的大空白确实清楚地表明了确定内部图大小的问题。另请参阅下面我对您的回答的评论。

标签: graphviz dot


【解决方案1】:

添加外部集群

为清楚起见显示了外部集群的边界框

将簇 cluster_1cluster_2cluster_3 嵌套在另一个簇中会导致布局引擎均匀地间隔它们。

使用布局引擎

但是,从下到上 rankdir 将显示顺序从左到右反转为 (cluster_3, cluster_2, cluster_1)。颠倒源文件中的顺序可以解决 [kludges over] 的问题。

工作代码

digraph G {
  nodesep=1.25;
  splines=false;
  clusterrank=local;
  node[width=1, shape=circle];
  edge[style=invis];

  subgraph cluster_0 {

    subgraph cluster_3 {
      label="Layer 3";
      "3-1" -> "3-2" -> "3-3";
    }

    subgraph cluster_2 {
      label="Layer 2";
      "2-1" -> "2-2" -> "2-3";
    }

    subgraph cluster_1 {
      label="Layer 1";
      "1-1" -> "1-2" -> "1-3";
    }
  }

 edge[style=solid, penwidth=1, constraint=false];

 "1-1" -> "2-1";
 "1-3" -> "2-1";

 "1-1" -> "2-2";
 "1-2" -> "2-2";

  "1-2" -> "2-3";
  "1-3" -> "2-3";

  "2-1" -> {"3-1" "3-2"};
  "2-3" -> {"3-1" "3-3"};

  "2-2" -> {"3-2" "3-3"};

}

注意事项

可以设置新的外部集群的样式,使其边界框不可见。

【讨论】:

  • 首先 - 外部集群拉伸图形大小,这是不受欢迎的行为。第二 - 在一个集群内绝对没有集群的排序。你的例子给出了我机器上集群的随机顺序(win7 64bit;gv 2.38.0)。结果是 123 像你的图像,321 有两个大间距,甚至是粗略的 231。
  • @stefan 在您的问题中,图表的大小是默认值。该手册描述了如何控制行为。这一次,我会让你自己读。不客气。
  • 我没有问任何问题。我确实指出了为什么我认为您的解决方案不是解决方案。首先 - 您的外部集群会拉伸图形大小。我不是在谈论可见性,而是在谈论以像素为单位的图像。如果我过度阅读了一个解决方案,如果您将我和 OP 指向手册中的要点并为 OP 和所有其他读者发布可重现的解决方案,我会很高兴。第二-您的“解决方案”确实显示出随机行为。请检查一下。除非这是我的 2.38.0 版本特有的错误,否则我认为您的解决方案完全错误,并要求您重新绘制答案。
  • 我的解决方案是解决问题中问题的最简单的方法。它在 Linux Ubuntu 15.04 上始终如一地工作。 Windows 的问题应报告给开发人员。如果问题出在像素上,请尝试输出到 SVG。文档可通过 Graphviz 网站获得。很抱歉将您的问题与问题中提出的问题混淆了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多