2017-10-09 111 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