在 graphviz 中使用 fdp 布局,有没有办法在同一集群中的节点之间与不同集群中的节点之间设置不同的边缘样条曲线?

Is there a way to have different edge splines between nodes in the same cluster vs between nodes in different clusters using fdp layout in graphviz?

我正在创建一个包含多个集群的图表。属于同一簇的节点之间有边,属于不同簇的节点之间有边。我正在使用 fdp 布局。有没有一种方法可以让集群内的节点使用一种边缘路由,而属于不同集群的节点使用另一种类型的边缘路由?

比如前者用splines=ortho,后者用splines=compound。我尝试这样做,但生成的图表似乎只使用主图表中指定的 splines 值。

我很确定单次传递无法完成 - splines 是图形级属性。但是我认为可以使用 5 遍技术来完成:

  1. 编辑输入文件
  • 移动集群内的所有集群内边缘
  • 在每个簇的开头添加edge[keep=1]
  1. 运行 fdp -Tdot -Gsplines=ortho(适用于所有)添加节点和边缘路由
  2. 运行第一步输出通过gvpr(或python?)到
  • pin所有节点节点[pin=true]在图的开头
  • 对于 keep==1 的每条边,将 pos 属性复制到(新)keeppos 属性
  1. 运行 步骤 2 通过 fdp -s -Tdot -Gsplines=compound 输出 - 这将覆盖所有边缘位置值
  2. 运行 step 3输出通过gvpr(或python?)替换poskeeppos(如果 keeppos!="")
  3. 运行 第 4 步输出通过 neato -s -n2 -Tsvg/png/...

哇!听起来很恶心,但似乎有效
p.s。 -s 步骤 3 和 5 需要选项来解决缩放问题
p.p.s。因为需要固定节点,所以仅 fdpneato(不是 dot

这是一个命令行:

f=multispline.gv;
F=`basename $f .gv`
fdp -Gsplines=true -Tdot $f | 
gvpr -c 'N{pin="true"}E[keep=="1"]{keeppos=$.pos}'| 
fdp -s -Gsplines=ortho -Tdot | 
gvpr -c 'E[keeppos!=""]{pos=keeppos}' | 
neato -s -n2 -Tsvg >oo.svg