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
在节点b
和g
之间通过?我尝试了许多不同的策略,graphviz 都拒绝了:
b
和g
保持在边界内,并且
允许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/
(足够接近?)
【讨论】:
在真实的图表上(我在这里提供的只是一个最小的例子),如果b
和g
之间有更多的空间会更好(上面有很多空间线)。我也不想修改编译过程以便于重新创建。目前,我最好的想法是完全删除 g
并在生成后手动添加。以上是关于Graphviz 在不同级别的节点之间强制排序的主要内容,如果未能解决你的问题,请参考以下文章