Graphviz 在不同级别的节点之间强制排序

Posted

技术标签:

【中文标题】Graphviz 在不同级别的节点之间强制排序【英文标题】:Graphviz enforce ordering between nodes of different levels 【发布时间】:2021-10-27 01:30:24 【问题描述】:

我有以下图表:

digraph 
  stylesheet = "..."
  subgraph cluster 
    b; c; g;
    rank=same; b; g;
  
  a -> b;
  b -> c;
  c -> d;
  c -> e;
  f -> c;
  rank=same; a; f;

有没有办法强制/鼓励边缘f -> c 在节点bg 之间通过?我尝试了许多不同的策略,graphviz 都拒绝了:

bg 保持在边界内,并且 允许g 出现在一边,而不干扰图表的其余部分。

任何建议将不胜感激!

【问题讨论】:

【参考方案1】:

确实,dot 算法不想按您的意愿路由 f->c 边。然而,neato 边缘路由算法会产生更接近的结果。所以我们使用 dot 来定位节点并使用 neato -n 来路由边缘。像这样:

dot -Tdot myfile.gv >out.dot
neato -n -Tpng out.dot >myfile.png

使用此输入:

 digraph 
  stylesheet = "https://g3doc.corp.google.com/frameworks/g3doc/includes/graphviz-style.css"
  nodesep=.5  // optional
  subgraph cluster 
    b 
    c; g 
    rank=same; b; g;
  

  f -> g [style=invis]
  f:se -> c:nw [constraint=false]

  a -> b;
  b -> c;
  c -> d;
  c -> e;

捐赠:

见https://graphviz.org/faq/#FaqDotWithNodeCoords 还有https://graphviz.org/docs/outputs/canon/

(足够接近?)

【讨论】:

在真实的图表上(我在这里提供的只是一个最小的例子),如果bg 之间有更多的空间会更好(上面有很多空间线)。我也不想修改编译过程以便于重新创建。目前,我最好的想法是完全删除 g 并在生成后手动添加。

以上是关于Graphviz 在不同级别的节点之间强制排序的主要内容,如果未能解决你的问题,请参考以下文章

Graphviz .dot 节点排序

强制graphviz中节点的从左到右顺序?

更改Graphviz中节点之间的距离

Graphviz:创建三个簇中节点之间具有直边的流程图

用点强制正交(垂直或水平)边缘

使用Graphviz在R中具有不同颜色的graphnode