在 graphviz 中订购集群节点

Order cluster nodes in graphviz

我有以下(简化的)图表,它由以下 .dot 生成:

digraph Configurations {

  subgraph cluster_1 {
    s_0_0 [shape=circle,style=filled,fixedsize=true,width=0.5,label="0",fillcolor=yellowgreen]
    s_0_1 [shape=circle,style=filled,fixedsize=true,width=0.5,label="1",fillcolor=yellowgreen]
  }
  subgraph cluster_2 {
    s_1_0 [shape=circle,style=filled,fixedsize=true,width=0.5,label="0",fillcolor=yellowgreen]
    s_1_1 [shape=circle,style=filled,fixedsize=true,width=0.5,label="1",fillcolor=white]
  }
  subgraph cluster_3 {
    s_2_0 [shape=circle,style=filled,fixedsize=true,width=0.5,label="0",fillcolor=white]
    s_2_1 [shape=circle,style=filled,fixedsize=true,width=0.5,label="1",fillcolor=yellowgreen]
  }
  subgraph cluster_4 {
    s_3_0 [shape=circle,style=filled,fixedsize=true,width=0.5,label="0",fillcolor=white]
    s_3_1 [shape=circle,style=filled,fixedsize=true,width=0.5,label="1",fillcolor=white]
  }

  s_0_1 -> s_1_1
  s_0_0 -> s_2_0
  s_2_1 -> s_3_1
  s_1_0 -> s_3_0
}

我希望能够在子图中强制排序,以便每个子图的节点按升序显示(每个集群应该有节点放置 (0, 1),从不放置 (1, 0 )).据我了解,子图中不支持 rankdir,这是我的第一次尝试,那么正确的方法是什么?我正在寻找一种解决方案,它给我一个相当相似的布局(然后将包含更多相交的箭头)并且是可扩展的,因为真实的图表将是巨大的。

事实证明,这可以通过在内部添加不可见边并在图形内部强制使用相同的等级来解决,如下所示:


subgraph cluster_1 {
    <b>{rank=same; s_0_0 s_0_1}
    s_0_0 -> s_0_1 [style=invis]</b>
    s_0_0 [shape=circle,style=filled,fixedsize=true,width=0.5,label="0",fillcolor=yellowgreen]
    s_0_1 [shape=circle,style=filled,fixedsize=true,width=0.5,label="1",fillcolor=yellowgreen]
}

如果节点数超过2个,我们需要改变解决方案。

subgraph cluster1 {
{
    HL_1_n HL_1_1 HL_1_2 HL_1_3 HL_1_m
}
HL_1_1   [label="Hidden Layer 1 Node 1" color=3]
HL_1_2   [label="Hidden Layer 1 Node 2" color=3]
HL_1_3   [label="Hidden Layer 1 Node 3" color=3]
HL_1_m   [label="Hidden Layer 1 Node ..." color=3]
HL_1_n   [label="Hidden Layer 1 Node H_1" color=3]
label = "Hidden Layer"

}

看来顺序已经确定了,所以我们只需要更改节点的位置以适应输出即可。该解决方案不使用边缘约束和等级。