在graphviz中如何在两个节点之间施加直边?

问题描述

这是我的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}
}

它产生以下结果:

enter image description here

我希望边缘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}
}

enter image description here

,

您可以做到这一点而无需摆弄端口。

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

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

我认为这是可行的,因为dotguide 2.6节中有这样的措辞(这些注释中的rankdir是默认的从上到下,因此对于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节点声明的上方,则边缘从Browser到{{1 }}越过Imperva(因为首先定义了exDNS)。将节点Imperva的定义移到Imperva的行下方-或完全像您的点一样忽略该节点的显式定义-因此Imperva是在inDNS之后定义的,并且边缘位于{{1}以下},就像您的图表一样。

inDNS

产生:

image produced using dot.exe -Tpng -O graph.dot