2017-10-09 114 views
0

This answer描述瞭如何將GraphViz集羣連接到節點和其他集羣。將GraphViz集羣連接到自身

我想連接一個集羣到自己,所以箭頭退出集羣邊界並重新進入(想象一個狀態機有一個過渡到自己)。

下面是一個例子:

digraph example {                
    compound=true;                
    "B" -> "C" [ltail="cluster_s0", lhead="cluster_s1", minlen=2];    
    "D" -> "C" [ltail="cluster_s1", lhead="cluster_s1", minlen=2];    
    subgraph cluster_s0 {              
     "A" -> "B";                
    }                   
    subgraph cluster_s1 {              
     "C" -> "D";                
    }                   
} 

這將引發警告,並提請集羣,而不是外部的內部箭頭:

Arrow is drawn inside the cluster

這裏是我想要什麼(很粗糙)素描:

Desired graph

有沒有辦法讓GraphViz畫一個從DC的箭頭,然後像上面的例子那樣退出並重新進入簇邊界?

+0

我認爲這是唯一的解決辦法是有D->Ç邊緣經過是這樣的集羣外的中間,看不見的節點 - 但我沒有運氣在其前往的位置這個節點是合理的,所以你最終得到的是遍佈整個地方的線條,而不是形成一個簡單的弧線。您可以通過將邊緣指定爲「D」來獲得更好的結果:n - >「C」:n' - 端口方向將線條變成一條弧線,但它仍然不會剪輯正確。 – jasonharper

回答

0

我不認爲這是可能的(並且會熱切地等待一位愛好者證明相反)。與此同時,你會考慮使用shape = record的解決方法嗎?我MWE

digraph example 
{                
    rankdir = LR; 

    node[ shape = record ]; 
    x [ label = " { <a>A | <b>B } " ]; 
    y [ label = " { <c>C | <d>D } " ]; 

    // edge 
    x -> y; 
    y:d:n -> y:c:n; 
} 

產生

enter image description here

有些工作可以做,使它看起來更有點像你的要求,但畢竟,這是一個不同的動物。

+0

不幸的是我需要一個可擴展的解決方案,因爲我將在具有大圖和許多不同節點類型和簇大小的複雜場景中使用它。 – jlicht

0

這裏是另一個解決辦法是有點難看不過,基本上你把子以外的一些額外的點節點,並與邊緣的連接沒有箭頭,你也可能希望將它們連接以相反的順序,以避免對佈局奇怪的影響:

digraph example {  
    rankdir=LR               
    compound=true;                
    "B" -> "C" [ltail="cluster_s0", lhead="cluster_s1"];    
    "C" -> "DC1" [ltail="cluster_s1", dir=none];  
    DC1[shape=point] 
    DC2[shape=point] 
    DC1 -> DC2 [dir=none] 
    "DC2" -> "D" [lhead="cluster_s1"];    
    subgraph cluster_s0 {              
     "A" -> "B";                
    }                   
    subgraph cluster_s1 {              
     "C" -> "D";   
    }                   
} 

enter image description here

您可以通過添加一個不可見的虛擬節點改善佈局了一下,但可能不縮放(我的猜測是,你將很難determin時添加虛擬節點)

digraph example {  
    rankdir=LR               
    compound=true;                
    "B" -> "C" [ltail="cluster_s0", lhead="cluster_s1"];    
    "C" -> "DC1" [ltail="cluster_s1", dir=back];  
    DC1[shape=point] 
    "DC2" -> "D" [lhead="cluster_s1"];    
    subgraph cluster_s0 {              
     "A" -> "B";                
    }                   
    subgraph cluster_s1 {              
     "C" -> "D";   
    }  
    DD[shape=point color=none] 
    {D DC2}->DD[color=none]                 
}   

enter image description here