在Graphviz中对齐子图、排序节点和重新定位边

在Graphviz中对齐子图、排序节点和重新定位边,graphviz,dot,Graphviz,Dot,我正在尝试绘制一个GraphViz图(使用版本2.38.0(20140413.2041)),但很难按照我想要的方式进行布局。我尝试过隐藏边、约束操作、子图(集群和非集群)等多种不同的组合,但似乎没有任何效果 以下是我当前的代码: digraph G { subgraph clustera { style=invis;rank=same A->B->C } subgraph clusterb { style=invis;rank=same;rank

我正在尝试绘制一个GraphViz图(使用版本
2.38.0(20140413.2041)
),但很难按照我想要的方式进行布局。我尝试过隐藏边、约束操作、子图(集群和非集群)等多种不同的组合,但似乎没有任何效果

以下是我当前的代码:

digraph G {
  subgraph clustera {
    style=invis;rank=same
    A->B->C
  }

  subgraph clusterb {
    style=invis;rank=same;rankdir=LR
    D->E [constraint=false]
  }

  subgraph clusterc {
    style=invis;rank=same
    F->G [constraint=false]
  }

  C -> D
  D -> F  [constraint=false]
  E -> C

  F -> A  [constraint=false]
  F -> C  [constraint=false]
  F -> E  [constraint=false]
}
下面是使用
dot-Tpng的渲染方式:

(所有的
F
边都关闭了“约束”,因为几乎所有其他的东西都会严重扭曲图形。)

我想要的是:

  • 节点
    F
    上方节点
    G
  • F
    G
    在图形上大致垂直居中
  • F
    G
    E
  • A
    E
    大致按照他们现在的安排
  • F
    A
    C
    E
    的边缘,以及从
    D
    F
    的边缘,大致沿直线(即不绕
    F
    /
    G
    组的右侧布线)
  • 作为奖励,我想通过
    C
    a
    正确地位于
    d
    E
    之上,但这并不重要
(我非常不希望
F
出现在
A
上方,就好像它是图形的根一样。)

以下是我正在寻找的一个近似值,用手工绘制:

这在GraphViz可行吗


(我应该注意,我非常愿意使用其他GraphViz工具之一,只是,
dot
是我唯一熟悉的工具。)

只需要一个集群来保持ABCDE组的一致性。向后的方向箭头和权重帮助很大

digraph g
{
    subgraph cluster_subCDE {
        color=invis;
        A; B; C; D; E;
    }
    A->B [weight=10];
    A->F [dir=back];
    B->C [weight=10];
    F->C;
    C->E [color=invis];
    C->D;
    D->E [constraint=false];
    E->C;
    F->G [weight=10];
    F->D [dir=back];
    F->E;
}

我的方法没有
子图
权重
s,只有
s垂直对齐节点,以及
约束=false
以及
dir=back
保留布局扭曲

digraph G {
  // nodes without a group
  D;
  E;

  // group left side
  node[group=left];
  A -> B -> C -> D;
  C -> E [dir=back];
  D -> E [constraint=false];

  // group right side
  node[group=right];
  F -> G;

  // inter group edges
  F -> C;
  edge [constraint=false];
  D -> F;
  F -> A;
  F -> E;
}

和对应于您的近似值。

稍微自由地解释您的需求,您可能会有一个没有边交叉的图形

digraph G { rankdir = LR ranksep = 1.2 nodesep = 0.5
  { rank=same A -> B -> C -> D -> E }
  D -> F
  { rank=same F -> G }
  edge [constraint=false]
  E -> C
  F -> A
  F -> C
  F -> E
}

G
A.
A.
B
B
A-B
C
C
B-C
D
D
C-D
E
E
D-E
F
F
D-F
电子商务
F-A
F-C
F-E
G
G
F-G

不错!我不知道
。只有,有一种方法可以交换D/E?@要交换D和E,只需更改第一次提到这些节点的顺序(交换图形的前两行并在D之前提到E)。@marapet。。。我没有意识到第一次提及和流动(并用dir=back和constraint=false控制它们)的效果!将这两行s“C->E[dir=back];”和“D->E[constraint=false]”切换到“E->C;”就可以比较这个图了,这真是太神奇了!和“D->E”!