使用Graphviz和neato时在集群边界和节点之间填充

时间:2012-03-26 11:13:00

标签: graphviz neato

我想在Graphviz中生成以下图表:

Desired layout

由于here解释的原因,这个:

digraph
{
   layout=dot;
   rankdir="LR";
   overlap = true;
   node[shape=record, height="0.4", width="0.4"];
   edge[dir=none];

   A; B; C; D; E; F; G; H; I;

   A -> B -> C;
   D -> E -> F;
   G -> H -> I;
   edge[constraint=false];
   A -> D -> G;

   subgraph clusterX
   {
      label="Cluster 1";
      A; B;
   }

   subgraph clusterY
   {
      label="Cluster 2";
      E; F; H; I;
   }

}

产生这个:

Not desired layout

关注some careful tweaking of the order of appearance of nodes

   F; E; I; H; D; G; A; B; C;

我得到了正确的结果。

虽然这有效,但我想更直接地控制节点的位置,所以我尝试切换到neato,以便我可以使用pos强制节点位置:

graph g
{
   layout=neato;
   node[shape=record, height="0.4", width="0.4"];
   edge[dir=none];

   A [pos="1,3!"];
   B [pos="2,3!"];
   C [pos="3,3!"];
   D [pos="1,2!"];
   E [pos="2,2!"];
   F [pos="3,2!"];
   G [pos="1,1!"];
   H [pos="2,1!"];
   I [pos="3,1!"];

   A -- B -- C;
   D -- E -- F;
   G -- H -- I;
   A -- D -- G;

   subgraph clusterX
   {
      label="Cluster 1";
      A;
      B;
   }

   subgraph clusterY
   {
      label="Cluster 2";
      E; F; H; I;
   }
}

这给出了以下结果:

enter image description here

如何让neato在群集边界和群集中的节点之间添加填充(与dot相同的方式)?

2 个答案:

答案 0 :(得分:4)

我讨厌成为派对的人,但我不认为neato-with-fixed-positions-clusters方法会成功。

群集支持取决于布局引擎 - not all engines support it to the same degree

  

请注意,无论好坏,群集子图都不是DOT的一部分   语言,但仅仅是某些人遵守的句法惯例   布局引擎。

Neato does not seem to be a part of the engines supporting clusters,虽然fdp确实支持neato之类的布局,但它确实not support fixed positions

在上面链接的论坛条目中,ERG建议在某些时候使用gvpr脚本来实现这一目标 - 可能不是您想到的解决方案。

顺便说一下,图表不应该是有向图,我会收到警告并用->替换所有--

答案 1 :(得分:0)

在每个集群周围添加一个周围集群,将其样式设置为“invis”并将其边距设置为您想要的集群之间的额外空间。 您的点文件如下:

digraph
{
   layout=dot;
   rankdir="LR";
   overlap = true;
   node[shape=record, height="0.4", width="0.4"];
   edge[dir=none];

   A; B; C; D; E; F; G; H; I;

   A -> B -> C;
   D -> E -> F;
   G -> H -> I;
   edge[constraint=false];
   A -> D -> G;

   subgraph clusterX_margin
   {
     style=invis
     margin=20.0
     subgraph clusterX
     {
        label="Cluster 1";
        A; B;
     }
   }

   subgraph clusterY_margin
   {
     style=invis
     margin=20.0
     subgraph clusterY
     {
        label="Cluster 2";
        E; F; H; I;
     }
   }
}