Graphviz .dot 节点排序

Posted

技术标签:

【中文标题】Graphviz .dot 节点排序【英文标题】:Graphviz .dot node ordering 【发布时间】:2011-11-29 11:38:38 【问题描述】:

我正在构建一个 epsilon NFA 以使用规范构造来识别正则表达式。我正在使用子图对正则表达式的各个部分进行分组。 * 运算符给我带来了特别的麻烦,因为 dot 决定移动节点的顺序。我尝试添加边缘权重以强制特定边缘变短以保持边缘的顺序一致,但这似乎不起作用。

我想做的是强制子图中的节点按特定顺序放置,以便输出图可识别为特定类型的(众所周知的)构造。在下面的示例中,我希望按该顺序放置边 3、4、5 和 6,但是点将它们按 6、3、4、5 的顺序放置。任何指针表示赞赏。

请注意,当前的权重参数与没有权重参数没有任何区别。

我有以下

digraph G 
    rankdir = LR;
    node [shape = none];
            0 [label = "start"];
    node [shape = circle];
            1 [label = "q1"];
            2 [label = "q2"];
            3 [label = "q3"];
            4 [label = "q4"];
            5 [label = "q5"];
    node [shape = doublecircle];
            6 [label = "q6"];
    subgraph re1 
            rank = same;
            edge[label = "0"];
            1 -> 2;
    ;
    subgraph re2 
            rank = same;
            edge[label = "ε"];
                    3 -> 4 [weight = 10];
            edge[label = "1"];
                    4 -> 5 [weight = 10];
            edge[label = "ε"];
                    5 -> 6 [weight = 10];
                    5 -> 4 [weight = 1];
                    6 -> 3 [weight = 1];
    ;
    edge[color=black];
            0 -> 1
    edge[label = "ε"];
            2 -> 3;

【问题讨论】:

【参考方案1】:

这就是我如何编写该图表:

首先,对我来说,这是一个从上到下而不是从左到右的图表,因此我删除了rankdir=LR 并添加了rank=same,仅用于节点 0/1 和节点 2/3。 我卸下了所有的重量 最重要的是,我将constraint=false 添加到与图形方向相反的边 - 从节点 4 到节点 5 的边,以及从节点 6 到节点 3 的边。

来源:

digraph G 
    0 [label = "start", shape = none]; 
    node [shape = circle];
    1 [label = "q1"];
    2 [label = "q2"];
    3 [label = "q3"];
    4 [label = "q4"];
    5 [label = "q5"];
    6 [label = "q6", shape = doublecircle];

    rank = same; 0 -> 1; 
    1 -> 2 [label = "0"];
    rank = same; 2 -> 3 [label = "ε"]; 
    4 -> 5 [label = "1"];
    edge [label = "ε"];
    3 -> 4;
    5 -> 6;
    5 -> 4 [constraint = false];
    6 -> 3 [constraint = false];

结果如下:

现在,如果您愿意,您可以保留rankdir=LR,只需获取您发布的标记,删除权重并将constraint=false 添加到与我相同的边缘,它也可以。

【讨论】:

以上是关于Graphviz .dot 节点排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Graphviz 获取节点和边数

使用 pydot 在 Graphviz 中垂直放置节点

graphviz:如果输出为 SVG,则不会插入 SVG 图像的节点

Graphviz:如何从 .dot 变为图形?

Emacs 使用graphviz-dot-mode创建架构图

为什么graphviz dot不能打开一个dot文件?