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

时间:2018-02-16 11:36:46

标签: graph graphviz dot

我正在尝试生成有向图。

我目前用DOT语言编写的graph.c代码:

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;
}

这给了我以下输出:

Directed Graph Only Conjunctive Edges

我的目标是包含已注释的边缘,但是添加它们会导致图形失去对齐并最终到达整个地方。

目标是这样的:

Disjunctive Graph

任何人都可以帮助解释有用的graphviz / dot属性,这样我就可以在不破坏连接弧的对齐的情况下添加析取弧吗?

1 个答案:

答案 0 :(得分:1)

一些可能性:

  • 使用group建议每个子图的所有节点的直线(如果可能,将具有相同组的节点排成一行)
  • 使用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;
}