在 graphviz 中如何强制两个节点之间的直边?

In graphviz how to force a straight edge between two nodes?

这是我的 graphviz 代码:

digraph G {
  rankdir="LR"
  node [shape=square]
  exDNS [label="External DNS"]
  inDNS [label="Internal DNS"]
  tm [label="Traffic Manager"]
  pri [label="App Service\nPrimary Region"]
  sec [label="App Service\nSecondary Region"]
  Browser -> {inDNS,exDNS} -> Imperva-> tm -> {pri,sec}
  Browser -> Imperva -> {pri,sec}
}

它产生以下结果: 我希望边缘 Browser -> Imperva 在节点 External DNSInternal DNS 之间直行。

我该怎么做?

我正在使用点渲染器。

很难让边缘表现出来(明确定位它们)。但是通过将边缘附加到端口,您可以对边缘位置产生一些影响。
我认为这就是您所追求的:

digraph G {
  rankdir="LR"
//  graph [splines=polyline]
  node [shape=square]
  exDNS [label="External DNS"]
  inDNS [label="Internal DNS"]
  tm [label="Traffic Manager"]
  pri [label="App Service\nPrimary Region"]
  sec [label="App Service\nSecondary Region"]
  Browser:ne -> exDNS -> Imperva
  Browser:e -> Imperva 
  Browser:se -> inDNS -> Imperva
  Imperva-> tm -> {pri,sec}
  Imperva -> {pri,sec}
}

您无需摆弄端口即可完成此操作。

您当前的点首先显式定义 exDNS 和 inDNS,然后在边缘隐式定义 Imperva。

我在下面的点中添加的是 exDNSinDNS 之间的节点 Imperva 的显式声明。

我认为这是可行的,因为在 dotguide 部分 2.6 中有这样的措辞(注意这些词中的 rankdir 是默认值 top-to-bottom 因此对于 rankdir=LR,请将左读为上,将右读为下) :

If a subgraph has ordering=out, then out-edges within the subgraph that have the same tail node wll fan-out from left to right in their order of creation.

TBH 我不完全确定这是原因,因为 dotguide 没有为 ordering.

提供默认值

不管点指南如何,在我下面的点中,如果我将 Imperva 的定义向上移动一行到 exDNS 节点声明上方,那么边缘从 BrowserImperva 越过 exDNS(因为 Imperva 是先定义的)。将节点 Imperva 的定义移至 inDNS 行下方 - 或者完全像您的点那样省略节点的显式定义 - 因此 Imperva 在 inDNS 之后定义,边缘低于 inDNS 喜欢你的图表。

digraph G {
  rankdir="LR"
  node [shape=square]
  exDNS [label="External DNS"]
    Imperva;
  inDNS [label="Internal DNS"]
  tm [label="Traffic Manager"]
  pri [label="App Service\nPrimary Region"]
  sec [label="App Service\nSecondary Region"]
  Browser -> {inDNS,exDNS} -> Imperva-> tm -> {pri,sec}
  Browser -> Imperva -> {pri,sec}
}

产生: