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

Aar*_*ies 7 dot graphviz

我正在尝试绘制 GraphViz 图表(使用 version 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]
}
Run Code Online (Sandbox Code Playgroud)

这是它的渲染方式dot -Tpng

当前点图

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

我想要的是:

  • 节点F之上的节点G
  • F并且G或多或少在图表上垂直居中
  • FG在右侧A通过E
  • AE或多或少地通过他们现在的安排
  • FAC、 和E以及从D到 的边或多或少遵循直线(即不围绕/组F的右侧布线)FG
  • 作为奖励,我有点想通过A和上方C的中心,但这不太重要DE

(我非常希望的一件事是 forF出现在上面A,就好像它是图表的根一样。)

这是我正在寻找的近似值,在 yEd 中手工列出:

yEd 图

这在 GraphViz 中可行吗?

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

mar*_*pet 5

这是我的方法,没有subgraphsweigths,只有groups 垂直对齐节点,constraint=falsedir=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;
}
Run Code Online (Sandbox Code Playgroud)

结果可以在此处看到,并且与您的近似值相对应。


Dan*_*Dan 1

只需要一个簇即可保持 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;
}
Run Code Online (Sandbox Code Playgroud)