好吧,我知道在GraphViz中对节点进行排序的问题已被扼杀到近乎死亡,但我还没有看到有人解决订购集群的问题.我尝试了书中的所有技巧:
文件中节点的顺序是从左到右.如果我不添加群集,dot只会做正确的事情并以正确的顺序显示它们而不会有任何提示.但是,当添加集群时,点洗牌(随机化?)订单.
我添加了不可见的边缘来尝试强制子集群之间的顺序; 但似乎只要子群集放置在群集内,dot就会决定某个特定的顺序,并且会毫不犹豫地让边缘遍布地图以保留它.
由于节点顺序和不可见边缘使我失望,我转向试图强制节点的位置.这再次失败,因为只有点集群,它忽略输入位置.通过fdp运行未经修改的dot输出(生成的位置)会导致崩溃,所以我也放弃了这个方向.
这是一个示例点文件,它生成下面的图像.绿线是"看不见的"边缘我添加失败尝试强制点从左到右排序一切.如果这是成功的,那么绿线就会从锚点到左边通过节点向右移动,而不会自己交叉.例如,每个be.0将位于其兄弟be.1的左侧,并且类似于tg-s).正如你所看到的那样,dot改变了子簇的顺序(将.1兄弟放在.0的左边).由于某些约束,无论是否有任何边缘,它就好像它是故意这样做的.我无法找到任何方式来说服它做其他事.这非常令人沮丧,因为生成的图表完全符合我的需求.
错误排序的点集群http://www.ben-kiki.org/oren/stackoverflow/diagram.png
所以.是否有任何方法可以强制dot尊重集群内的某些集群顺序?
编辑:进一步研究,看起来群集的默认排序与节点的默认排序相反.也就是说,通常(在TB图中),文本中首先出现的节点将倾向于出现在文本后面出现的节点的左侧 ; 但似乎在文本中首先出现的子群集往往会出现在文本后面出现的子群集的右侧.现在,如果这是一个强硬的规则,生活将是伟大的; 然而,有时(但不常见)点仍然坚持重新排列子簇,不管任何产生的交叉边缘,看起来"只是因为".所以问题仍然存在.
有点晚了,但这里有一些其他想法:(示例数据有点大,无法使用)
无论如何,你尝试过:
这是一个简单的示例,成功地改变了一半节点(包括集群)的顺序
digraph G {
subgraph cluster_sa{
edge[weight=1000]
subgraph cluster_s1a{ s1a1->s1a2 }
subgraph cluster_s2a{ s2a1->s2a2 }
subgraph cluster_s1a_{ s1a1_->s1a2_ }
subgraph cluster_s2a_{ s2a1_->s2a2_ }
s1a2->s1a1_
s2a2->s2a1_
}
{
edge[constraint=false]
subgraph cluster_ta{
subgraph cluster_t1a{ t1a1->t1a2 }
subgraph cluster_t2a{ t2a1->t2a2 }
subgraph cluster_t1a_{ t1a1_->t1a2_ }
subgraph cluster_t2a_{ t2a1_->t2a2_ }
t1a2->t1a1_
t2a2->t2a1_
}
edge[tailport=s headport=s]
s1a2_->t1a1
s2a2_->t2a1
}
edge[color=green]
node[color=green]
{rank=same s1a0->s2a0->t2a0->t1a0}
s1a0->s1a1
s2a0->s2a1
t1a0->t1a2_
t2a0->t2a2_
t1a2_->t1a1_->t1a2->t1a1
t2a2_->t2a1_->t2a2->t2a1
}
Run Code Online (Sandbox Code Playgroud)
在 viz-js.com 上呈现
有时,以反向顺序连接节点也可能很有用(例如 t2a2_->t2a1_[dir=back] 而不是上面的实际上会更好,因为然后可以删除绿色箭头,给出直黑色箭头),但我不认为这对你的情况会有帮助