Graphviz-对齐节点和簇

Graphviz-对齐节点和簇,graphviz,dot,Graphviz,Dot,我试图用Graphviz画一个有限状态图,但我不能得到我想要的。以下是我到目前为止所写的内容: digraph G { rankdir = LR; subgraph cluster_op1 { subgraph cluster_0 { 1 -> 2 [label="a"] } subgraph cluster_1 { 3 -> {4 6} [label="&

我试图用Graphviz画一个有限状态图,但我不能得到我想要的。以下是我到目前为止所写的内容:

digraph G {
    rankdir = LR;

    subgraph cluster_op1 {

        subgraph cluster_0 {
            1 -> 2 [label="a"]  
        }

        subgraph cluster_1 {
            3 -> {4 6} [label="ε"]
            4 -> 5 [label="b"]
            5 -> 4 [label="ε"]
            5 -> 6 [label="ε"]
        }

        subgraph cluster_2 {
            7 -> {8 10} [label="ε"]
            8 -> 9 [label="c"]
            9 -> 8 [label="ε"]
            9 -> 10 [label="ε"]
        }   

        2 -> 3 [label="ε"]
        6 -> 7 [label="ε"]
    }

    subgraph cluster_op2 {

        subgraph cluster_3 {
            11 -> {12 14} [label="ε"]
            12 -> 13 [label="ab"]
            13 -> 12 [label="ε"]
            13 -> 14 [label="ε"]
        }   

        subgraph cluster_4 {
            15 -> 16 [label="c"]    
        }

        14->15 [label="ε"]
    }

    0 -> {1 11} [label="ε"]
    {10 16} -> 17 [label="ε"]
}
下面是它的样子:

我想要的是:

  • 集群_op1
    中的所有节点水平对齐(与集群_op2相同)
  • cluster_op2
    居中于
    cluster_op1
  • 从节点
    0
    cluster\u op1
    cluster\u op2
    的边长度相同(这两个簇到节点
    17
    的边长度相同)

  • 这不仅仅是一个真正的解决方案,更是一种黑客手段,但它能满足您的需求,至少在这里介绍的案例中是如此

    它使用三个要素:

    分组以促进节点之间的直线

    权重如果一个节点指向另两个节点(所有节点都在同一个组中)而使组混淆,则提供帮助;并使集群在它们之间保持一致

    INVI边缘对齐
    cluster_op2
    下方的
    cluster_op1
    ——因此它不是居中而是手动调整的

    此外,在适用的情况下,我将
    b->a
    替换为
    a->b[dir=back]
    ;我认为这是避免难以发现的bug的良好实践

    这是您编辑的代码:

    digraph G {
        rankdir = LR;
        0, 1, 2, 15, 16, 17
        3, 4, 5, 6     [ group = 1 ];
        7, 8, 9, 10    [ group = 2 ];
        11, 12, 13, 14 [ group = 3 ];
        2 -> 11[ style = invis ];
    
        subgraph cluster_op1 {
    
            subgraph cluster_0 {
                1 -> 2 [ label="a" ]; 
            }
    
            subgraph cluster_1 {
                3 -> 4 [ label="ε", weight = 4 ];
                3 -> 6 [ label="ε" ];
                4 -> 5 [ label="b" ];
                4 -> 5 [ label="ε", dir = back];
                5 -> 6 [ label="ε", weight = 4 ];
            }
    
            subgraph cluster_2 {
                7 -> {8 10} [label="ε"]
                8 -> 9 [label="c"]
                8 -> 9 [ label="ε", dir = back ];
                9 -> 10 [label="ε"]
            }   
    
            2 -> 3 [ label="ε", weight = 10 ;]
            6 -> 7 [ label="ε" ];
        }
    
        subgraph cluster_op2 {
    
            subgraph cluster_3 {
                11 -> 12 [ label="ε", weight = 4 ];
                11 -> 14 [ label="ε" ];
                12 -> 13 [ label="ab" ];
                12 -> 13 [ label="ε", dir = back ];
                13 -> 14 [ label="ε", weight = 4 ];
            }   
    
            subgraph cluster_4 {
                15 -> 16 [label="c"]    
            }
    
            14->15 [ label="ε", weight = 10 ];
        }
    
        0 -> {1 11} [label="ε"]
        {10 16} -> 17 [label="ε"]
    }
    
    产生


    感谢您提供有用的代码和清晰的问题!顺便说一下,你的要求是2。三,。矛盾