GraphViz-添加析取边时保持有向图对齐

GraphViz-添加析取边时保持有向图对齐,graph,graphviz,dot,Graph,Graphviz,Dot,我正在尝试生成一个有向图 我的当前图形.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; } sub

我正在尝试生成一个有向图

我的当前图形.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
    建议每个子图的所有节点的一条直线(如果可能,具有相同组的节点以直线布置)
  • 对“析取”边使用
    constraint=false
  • 当然,
    spline=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;
}

constraint=false是解决方法。谢谢您!