在graphviz

时间:2015-11-27 14:55:07

标签: graphviz

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

enter image description here

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,这是我的第一次尝试,在子图中不受支持,那么这样做的正确方法是什么?我正在寻找一个解决方案,它给我一个相当类似的布局(然后包含更多相交的箭头)并且是可扩展的,因为真实的图形将是巨大的。

2 个答案:

答案 0 :(得分:1)

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


subgraph cluster_1 {
    {rank=same; s_0_0 s_0_1}
    s_0_0 -> s_0_1 [style=invis]
    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]
}

答案 1 :(得分:1)

如果节点数多于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"

}

似乎订单已经确定,所以我们只需要更改节点'位置以适应输出。该解决方案不使用边缘约束和排名。