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:如果输出为 SVG,则不会插入 SVG 图像的节点