将GraphViz群集连接到自身

时间:2017-10-09 12:13:12

标签: graphviz dot

This answer描述了如何将GraphViz群集连接到节点和其他群集。

我想将群集连接到自身,因此箭头退出群集边界并重新进入(想想一个转换为自身的状态机)。

以下是一个例子:

tree = ET.parse(url)
root = tree.getroot()
for a in root.findall('.//{http://www.opengis.net/gml}coordinates'):
    print(a.text)

这会抛出警告并在集群内而不是外部绘制箭头:

Arrow is drawn inside the cluster

这是我想要的(非常粗略)草图:

Desired graph

有没有办法让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"; } } D绘制一个退出并重新进入群集边界的箭头,如上例所示?

2 个答案:

答案 0 :(得分: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

可以做一些工作使它看起来更像你的要求,但毕竟它是一种不同的动物。

答案 1 :(得分:0)

这是另一种解决方法,虽然它有点难看,基本上你在子图外部放置一些额外的点节点并连接没有箭头的边缘,你也可能想要以相反的顺序连接它们以避免对布局产生奇怪的影响:

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

你可以通过添加一个不可见的虚拟节点来改善布局,但这可能不会缩放(我的猜测是你将难以确定何时添加虚拟节点)

{{1}}

enter image description here