【问题标题】:Graphviz - aligning nodes and clustersGraphviz - 对齐节点和集群
【发布时间】:2018-03-18 13:53:21
【问题描述】:

我正在尝试使用 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="ε"]
}

这是它的样子:

我想要的是:

  1. cluster_op1 内的所有节点水平对齐(@9​​87654325@ 相同)
  2. cluster_op2cluster_op1 下方居中
  3. 从节点0cluster_op1cluster_op2 的边长度相同(从这两个集群到节点17 的边长度相同)

【问题讨论】:

  • 感谢您提供有用的代码和明确的问题!
  • 顺便说一句,你的要求 2. 和 3. 是矛盾的

标签: graphviz dot


【解决方案1】:

这是一个技巧,而不是真正的解决方案,但它可以为您提供所需的东西,至少对于此处介绍的案例而言。

它使用三个元素:

group 方便节点之间的直线,

权重 以帮助组因一个节点指向其他两个节点而感到困惑,所有这些节点都在同一个组中;并使集群在它们之间保持一致,

invis 边缘对齐 cluster_op2 下方 cluster_op1 - 所以它不是居中而是手动调整。

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

这是您编辑的代码:

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="ε"]
}

产生

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 2021-11-30
    • 2020-08-14
    • 2016-03-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多