团簇存在时的GraphViz水平顺序

团簇存在时的GraphViz水平顺序,graphviz,dot,Graphviz,Dot,好的,我知道GraphViz中节点排序的问题已经被散列到了近乎死亡的地步,但是我还没有看到任何人解决集群排序的问题。我尝试了书中的所有技巧: 文件中节点的顺序是从左到右。如果我不添加集群,dot只会做正确的事情,并在没有任何提示的情况下以正确的顺序显示它们。但是,当添加簇时,点无序(随机化?)顺序 我添加了不可见的边,试图强制子簇之间的顺序;但看起来,一旦子簇被放置在一个簇内,dot就会决定某个特定的顺序,并且会毫不犹豫地让边缘环绕地图以保留它 由于节点和不可见边的顺序使我失败,我转而尝试

好的,我知道GraphViz中节点排序的问题已经被散列到了近乎死亡的地步,但是我还没有看到任何人解决集群排序的问题。我尝试了书中的所有技巧:

  • 文件中节点的顺序是从左到右。如果我不添加集群,dot只会做正确的事情,并在没有任何提示的情况下以正确的顺序显示它们。但是,当添加簇时,点无序(随机化?)顺序

  • 我添加了不可见的边,试图强制子簇之间的顺序;但看起来,一旦子簇被放置在一个簇内,dot就会决定某个特定的顺序,并且会毫不犹豫地让边缘环绕地图以保留它

  • 由于节点和不可见边的顺序使我失败,我转而尝试强制节点的位置。这再次失败,因为只有点进行聚类,并且忽略输入位置。即使是通过fdp运行未修改的dot输出(使用生成的位置)也会导致崩溃,所以我也放弃了这个方向

下面是一个生成下图的示例。绿线是我添加的“看不见的”边,我试图强制dot从左到右排序,但没有成功。如果此操作成功,绿线将从锚点向左穿过节点,然后向右移动,而不会交叉。例如,每个be.0将位于其同级be.1的左侧,对于tg-s也是如此)。如您所见,dot改变了子集群的顺序(将.1同级放在.0同级的左边)。这就好像是出于某种约束,不管有什么边缘,它都是故意这样做的。我找不到任何方法来说服它做其他事情。这是非常令人沮丧的,因为生成的图表非常适合我的需要


(来源:)

所以。有没有办法迫使dot遵守簇内簇的某些顺序


编辑:进一步看,集群的默认顺序似乎与节点的顺序相反。也就是说,通常(在TB图中),文本中首先出现的节点将倾向于出现在文本中稍后出现的节点的左侧;但是,文本中首先出现的子簇似乎会出现在文本中稍后出现的子簇的右侧。现在,如果这是一条硬性规定,生活将是美好的;然而,dot仍然有时(但不太经常)坚持重新排列子簇,而不管产生任何交叉边,似乎“只是因为”。所以问题仍然存在。

有点晚了,但这里有一些其他的想法: (示例数据有点太大,无法处理)

无论如何,你试过:

  • 某些黑线/红线上的边[constraint=false](constraint=false)可能会 一些奇怪的长边布线(尽管如此)
  • 和/或绿线上的边缘[weight=1000](更难正确定位)
  • 你可能还想多加一点脚手架
  • 您不能在集群中排列=相同,因此如果需要,它必须位于脚手架节点上
下面是一个简单的示例,它成功地改变了包括集群在内的一半节点的顺序

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]而不是上面的方式实际上会更好,因为绿色箭头可能会被删除,并给出一个直接的黑色箭头),但我认为这对您的情况没有帮助

到目前为止,在我的源文件中重新排序集群对我来说是有效的。谢谢你的提示