【问题标题】:GraphViz DOT rectangular layout with uneven distribution of nodes along parallel sidesGraphViz DOT 矩形布局,节点沿平行边分布不均匀
【发布时间】:2019-12-23 01:57:05
【问题描述】:

我正在尝试扩展此rectangular layout example。目标是生成类似的布局,但节点的动态分布(在合理范围内,例如每行不超过 20 个)沿顶部和底部。 (目前,边总是 3 个节点。)

我当前的简化基本示例使用以下代码:

digraph {
  rankdir="LR";

  node [group=top];
  aa -> ab -> ac -> ad -> ae -> af -> ba;

  { rank="same"; ba -> bb -> ca; }

  node [group=bot];
  da -> cc -> cb -> ca [ dir="back" ];

  { rank="same"; aa -> db -> da [ dir="back"]; } 
}

输出:

我遇到的所有 SO 解决方案都建议使用不可见节点,但这似乎不切实际,因为我将计算出最小公倍数,相应地间隔节点,并创建一个不可见边来锁定它们地方。如果没有更好的选择,我想把它作为最后的手段。

尝试了其他几种方法,例如为每个边缘分别计算和设置minlen,使用clusterranknodesepranksepconstraint等设置。

关于如何沿布局的顶部和底部均匀分布节点的任何其他想法?

(我与 GraphViz 无关。欢迎使用其他软件库。最好是免费的并带有 Python API。)

【问题讨论】:

    标签: layout graphviz diagram dot


    【解决方案1】:

    dot 将始终试图找出节点的“正确”层次位置,因此“等间距”在一个图中毫无意义。为了让一个节点到一个特定的位置,你总是需要告诉dot这个位置。空节点提供了很大的灵活性,但可能很麻烦。

    在您的情况下,您可以计算应该垂直对齐的节点,然后简单地使用另一个 rank = same 指令。诚然,这不是您问题的真正答案(因为我认为这样的答案不存在)但可能是对空节点方法的改进:

    digraph {
      rankdir="LR";
    
      node [group=top];
      aa -> ab -> ac -> ad -> ae -> af -> ba;
    
      { rank="same"; ba -> bb -> ca; }
    
      node [group=bot];
      da -> cc -> cb -> ca [ dir="back" ];
    
      { rank="same"; aa -> db -> da [ dir="back"]; }
    
      // this leads to a manually fixed "equal spacing": 
      { rank = same; ac cc }
      { rank = same; ae cb }
    }
    

    给你

    【讨论】:

    • 这是我在提到使用不可见节点时所暗示的方法。如果真的没有选择,我可能仍会使用此选项作为折衷方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    相关资源
    最近更新 更多