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

6
我希望能够在Graphviz中生成以下图形: Desired layout 由于此处解释的原因,请参见这里
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;
   }

}

将此代码:

不希望的布局

按照节点出现顺序进行仔细调整,可以得到如下结果:

   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个回答

4
我不想扫兴,但我认为采用固定位置和簇的方法并不会成功。
簇支持取决于布局引擎-并非所有引擎都同样支持

请注意,无论好坏,簇子图都不是DOT语言的一部分,而只是某些布局引擎遵循的一种语法约定。

Neato似乎不是支持簇的引擎之一,而fdp虽然支持类似neato的布局,但不支持固定位置
在上面链接的论坛条目中,ERG在某个时候提议使用gvpr脚本来实现这一点-可能不是您考虑的解决方案。
顺便说一下,图表不应该是有向图,我收到警告并将所有的“->”替换为“--”。

感谢@marapet。看起来我得改变我的方法。感谢您提供的信息和链接。我已更新问题以删除有向边缘。 - Warren Blumenow

1
在每个集群周围添加一个包围集群,将其样式设置为“invis”,并将其边距设置为您想要的集群之间的额外空间。 您的dot文件如下所示:
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;
     }
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接