好的,我知道在 GraphViz 中排序节点的问题已经被散列到了濒临死亡的地步,但我还没有看到有人解决排序集群的问题。我尝试了书中的所有技巧:
文件中节点的顺序是从左到右。如果我不添加集群,dot 只会做正确的事情并以正确的顺序显示它们而无需任何提示。但是,当添加集群时,点会打乱(随机化?)顺序。
我添加了不可见的边缘来尝试强制子集群之间的顺序;但似乎一旦将子集群放置在集群内,dot 就会决定一些特定的顺序,并且会毫不犹豫地让边缘遍布地图以保留它。
由于节点顺序和不可见边使我失败,我转而尝试强制节点的位置。这再次失败,因为只有 dot 会进行聚类,并且它会忽略输入位置。甚至通过 fdp 运行 dot 的未修改输出(使用生成的位置)也会导致崩溃,所以我也放弃了那个方向。
这是一个生成下图的示例点文件。绿线是我添加的“不可见”边缘,但未成功尝试强制 dot 从左到右排序所有内容。如果这成功了,绿线将从锚点向左穿过节点,然后向右移动,而不会相互交叉。例如,每个 be.0 将位于其兄弟 be.1 的左侧,对于 tg-s 也是如此)。如您所见, dot 打乱了子集群的顺序(将 .1 同级放在 .0 的左侧)。就好像它是故意这样做的,由于一些限制,不管任何边缘。我找不到任何方法来说服它不这样做。这非常令人沮丧,因为生成的图表非常适合我的需求。
(来源:ben-kiki.org)
所以。有什么办法可以强制 dot 尊重集群内集群的某种顺序?
编辑:进一步研究,似乎集群的默认顺序与节点的顺序相反。也就是说,通常(在 TB 图中),文本中最先出现的节点往往会出现在文本中稍后出现的节点的左侧;但似乎首先出现在文本中的子集群往往会出现在文本中稍后出现的子集群的右侧。现在,如果这是一条硬性规定,生活将是美好的;然而,dot 仍然有时(但不那么频繁)坚持重新排列子集群,不管任何由此产生的交叉边缘,似乎“只是因为”。所以问题仍然存在。