GraphViz - 添加分离边时保持有向图对齐

GraphViz - maintain digraph alignment when adding disjunctive edges

我正在尝试生成有向图。

我当前的 graph.c DOT 语言代码:

digraph G {

rankdir = LR;
splines = line;

subgraph start{
start -> J0M0;
start -> J1M2;
start -> J2M0;
start -> J3M0;
}

subgraph J0 {
    J0M0 -> J0M1;
    J0M1 -> J0M2;
    J0M2 -> J0M3;
}

subgraph J1 {
    J1M2 -> J1M0;
    J1M0 -> J1M1;
    J1M1 -> J1M3;
}

subgraph J2 {
    J2M0 -> J2M1;
    J2M1 -> J2M2;
    J2M2 -> J2M3;
}

subgraph J3 {
    J3M0 -> J3M2;
    J3M2 -> J3M3;
    J3M3 -> J3M1;
}

{rank=same;}

J1M3 -> JE;
J0M3 -> JE;
J2M3 -> JE;
J3M1 -> JE;

 //    J0M0 -> J2M0;
 //    J0M1 -> J2M1;
 //    J0M3 -> J2M3;
 //    J1M2 -> J0M2;
 //    J2M0 -> J3M0;
 //    J2M1 -> J3M1;
 //    J2M2 -> J1M2;
 //    J2M3 ->J1M3;
 //    J3M0 -> J1M0;
 //    J3M2 -> J2M2;
 //    J3M3 -> J0M3;
 //    J3M1 -> J1M1;
}

这给了我以下输出:

我的目标是包括注释掉的边,但是添加它们会导致图形失去对齐并最终到处都是。

目标是这样的:

任何人都可以帮助解释有用的 graphviz/dot 属性,以便我可以添加析取弧而不破坏合取弧的对齐吗?

一些可能性:

  • 使用group将每个子图的所有节点建议一条直线(同组的节点尽可能排成一条直线)
  • 对'disjunctive'条边使用constraint=false
  • 当然 splines=false 平滑边缘

导致:

digraph G {

rankdir = LR;
splines = true;
start;
JE;

J0M0[group=a];
J1M2[group=b];
J2M0[group=c];
J3M0[group=d];

subgraph start{
start -> J0M0;
start -> J1M2;
start -> J2M0;
start -> J3M0;
}

node[group=a];
subgraph J0 {
    J0M0 -> J0M1;
    J0M1 -> J0M2;
    J0M2 -> J0M3;
}

node[group=b];
subgraph J1 {
    J1M2 -> J1M0;
    J1M0 -> J1M1;
    J1M1 -> J1M3;
}

node[group=c];
subgraph J2 {
    J2M0 -> J2M1;
    J2M1 -> J2M2;
    J2M2 -> J2M3;
}

node[group=d];
subgraph J3 {
    J3M0 -> J3M2;
    J3M2 -> J3M3;
    J3M3 -> J3M1;
}

{rank=same;}

J1M3 -> JE;
J0M3 -> JE;
J2M3 -> JE;
J3M1 -> JE;

edge[constraint=false];
     J0M0 -> J2M0;
     J0M1 -> J2M1;
     J0M3 -> J2M3;
     J1M2 -> J0M2;
     J2M0 -> J3M0;
     J2M1 -> J3M1;
     J2M2 -> J1M2;
     J2M3 ->J1M3;
     J3M0 -> J1M0;
     J3M2 -> J2M2;
     J3M3 -> J0M3;
     J3M1 -> J1M1;
}