【问题标题】:graphViz/dot: Adjusting node placement and edge shapegraphViz/dot:调整节点位置和边缘形状
【发布时间】:2020-02-19 05:16:48
【问题描述】:

我有一张可以用英文概括的图表:

A -> [B -> C -> D] -> E
B -> A
E -> B

方括号表示一个子图,并在其周围画了一个框。

我在graphViz/dot中实现了如下:

digraph {
  rankdir = LR
  graph [overlap = true, fontname = Helvetica]

  A [shape="box", style="dashed", label="Alab"]

  subgraph clusterx {
    node [shape="box"]
    B [label="Blab"]
    C [label="Clab"]
    D [label="Dlab"]

    B -> C -> D
    label = "Subgraph Box Label";
    labeljust = "l";
  }

  E [shape="box", style="dashed", label="Elab"]
  A -> B [label = " ", headport="nw", tailport="ne"]
  B -> A [label = " ", headport="se", tailport="sw"]
  D -> E
  E -> B [tailport="s", headport="s"]
}

这以有效的方式呈现,但我想纠正一些视觉问题。

  1. 我希望A 和子图之间有更多空间,而子图节点之间的空间更小。
  2. 我希望E 与其他节点在同一垂直对齐上。我希望 D -> E 边缘是一条平线。
  3. 我希望E -> B 边缘以更美观的方式弯曲。我希望它从E的's'端口出来,左转90度,继续左转直到到达节点B,然后向上转90度,然后输入's' B 的端口以垂直方式。我相信这是因为 graphViz 间隔样条点的方式 - 我想我真正想要做的是将每个中间样条点向下拖动一点,以便边缘的左行部分是平的。

我尝试调整 nodesepranksep 参数来解决前两个问题,但无法始终如一地理解为什么我所做的更改会产生它们所做的更改。我根本无法解决#3。

此外,我在 R 中使用 diagrammeR 将其呈现为 PDF 和 HTML 文档,因此此处的任何答案都应该与输出格式无关,以防万一。

有什么建议吗?我尝试搜索 graphViz 文档无济于事,我找不到任何表现出这些问题的工作示例。

【问题讨论】:

    标签: graphviz diagrammer


    【解决方案1】:

    要改善节点的位置和边缘的形状(尽管这与您想象的不完全一样),请使用constraint=false

    E -> B [tailport="s", headport="s", constraint=false]
    

    AB 之间的空间更复杂 - 图中和子图中的等级分离相同。您可以插入一个不可见的节点来增加距离,但这可能不值得:

    ranksep=0.2;
    invisnode[style=invis, shape=point, width=0.2];
    A -> invisnode [style=invis];
    invisnode -> B [style=invis];
    

    并使用dir=back 反转从BA 的边缘方向:

    A -> B [label = " ", headport="sw", tailport="se", dir=back]
    

    【讨论】:

    • 首先,非常感谢。这很棒。我可能不会添加不可见节点,因为复杂性权衡不是最好的。你能帮我理解为什么“constraint = false”适用于E -> B 问题吗?我知道这个参数告诉g​​raphViz不要在排名中考虑这个边缘——但不是为什么它会起作用。 E 节点的排名已经高于(低于)其他所有节点,并且节点的奇怪位置不是沿着排名轴,而是离轴。再次感谢。
    • 据我了解,节点位置经过优化,允许放置从节点中心到节点中心的所有边。考虑到端口等,边缘本身在第二步中布局。因此,将节点 E 放置在一条直线上以将边缘返回到 B 是有意义的。constraint=false 不仅禁用边缘影响排名,还可以根据需要将节点置于其排名内以连接所有边。
    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2012-10-10
    相关资源
    最近更新 更多