好吧,我知道在 GraphViz 中排序节点的问题已经接近死亡,但我还没有看到有人解决排序集群的问题。我尝试了书中的所有技巧:
这是一个 example dot file产生下面的图像。绿线是我添加的“不可见”边缘,试图强制点从左到右对所有内容进行排序,但未成功。如果这成功了,绿线将从 anchor 向左穿过节点,然后向右移动,而不会交叉。例如,每个 be.0 将在其同级 be.1 的左侧,对于 tg-s 也是如此)。如您所见, dot 打乱了子簇的顺序(将 .1 兄弟放在 .0 的左侧)。就好像它是故意这样做的,由于一些限制,不管任何边缘。我找不到任何方法来说服它不这样做。这非常令人沮丧,因为生成的图表非常适合我的需求。
(来源:ben-kiki.org)
所以。有没有任何 有什么方法可以强制 dot 遵守集群内集群的某些顺序?
编辑:进一步研究这一点,似乎集群的默认顺序与节点的顺序相反。也就是说,通常(在 TB 图中),首先出现在文本中的节点将倾向于出现在文本中稍后出现的节点的左侧;但似乎首先出现在文本中的子簇往往会出现在文本中稍后出现的子簇的右侧。现在,如果这是一个硬性规定,生活会很棒;然而, dot 有时(但不经常)仍然坚持重新排列子簇,不管产生的任何交叉边缘,似乎“只是因为”。所以问题仍然存在。
最佳答案
有点晚了,但这里有一些其他人的想法:
(示例数据有点大,无法使用)
无论如何你有没有试过:
虽然有些奇怪的长边路由)
这是一个简单的例子,它成功地改变了包括集群在内的一半节点的顺序
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
}
在 viz-js.com 上呈现
有时,以相反的顺序连接节点也可能很有用(例如 t2a2_->t2a1_[dir=back] 而不是上面的实际上会更好,因为绿色箭头可以被删除,给出一个直的黑色箭头)但我不认为这对你的情况会有帮助
关于存在集群时的 GraphViz 水平顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942033/