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

在graphviz中,如何强制两个节点之间的直边?,graphviz,dot,Graphviz,Dot,这是我的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"

这是我的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
直接在节点
外部DNS
内部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}
}

很难使边正常工作(明确定位它们)。但是,通过将边缘附加到端口,可以对边缘位置产生一些影响。
我想这就是你想要的:

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和INDN,然后在边中隐式定义Imperva

我在下面的点中添加的全部内容是在
exDNS
inDNS
之间显式声明node
Imperva

我认为这是可行的,因为第2.6节中有这样的措辞(注意,在这些词语中,rankdir是默认的自上而下,因此对于rankdir=LR,将左读为上,右读为下):

TBH我不完全确定这是原因,因为dotguide没有为
排序提供默认值

无论dotguide如何,在我下面的点中,如果我将
Imperva
的定义向上移动一行,使其位于
exDNS
节点声明上方,则从
Browser
Imperva
的边将通过
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}
}
产生:


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

当前点首先显式定义exDNS和INDN,然后在边中隐式定义Imperva

我在下面的点中添加的全部内容是在
exDNS
inDNS
之间显式声明node
Imperva

我认为这是可行的,因为第2.6节中有这样的措辞(注意,在这些词语中,rankdir是默认的自上而下,因此对于rankdir=LR,将左读为上,右读为下):

TBH我不完全确定这是原因,因为dotguide没有为
排序提供默认值

无论dotguide如何,在我下面的点中,如果我将
Imperva
的定义向上移动一行,使其位于
exDNS
节点声明上方,则从
Browser
Imperva
的边将通过
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}
}
产生:


我不明白您在我的代码中做了哪些更改。我从浏览器开始在三个边缘添加了(尾部)端口()。这有助于打开外部DNS和内部DNS之间的鸿沟。哦,现在我可以看到它-浏览器:ne。明白了。我不明白你在我的代码中做了什么更改。我从浏览器开始在三个边缘添加了(尾部)端口()。这有助于打开外部DNS和内部DNS之间的鸿沟。哦,现在我可以看到它-浏览器:ne。明白了,很有趣+1非常有趣+1.