examples - nodesep graphviz
Graphviz.dot nodo de orden (1)
Estoy construyendo una NFA épsilon para reconocer una expresión regular utilizando la construcción canónica. Estoy usando subgrafos para agrupar varias partes de la expresion regular. El operador * me está dando un problema particular ya que dot ha decidido mover el orden de los nodos. He intentado agregar pesos de bordes para forzar que los bordes en particular sean cortos para mantener el orden de los bordes en línea, pero eso no parece funcionar.
Lo que me gustaría hacer es forzar a los nodos en un subgrafo a colocarse en un orden particular para que el gráfico de salida sea reconocible como un tipo particular de construcción (bien conocida). En el siguiente ejemplo, me gustaría que los bordes 3, 4, 5 y 6 se colocaran en ese orden, sin embargo, el punto los coloca en el orden 6, 3, 4, 5. Cualquier puntero que se aprecie.
Tenga en cuenta que el parámetro de peso actual no produce ninguna diferencia que ningún parámetro de peso.
Tengo los siguientes
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;
}
Así es como escribiría esa gráfica:
- En primer lugar, para mí este es un gráfico que va de arriba a abajo, no de izquierda a derecha, por lo tanto,
rankdir=LR
y agreguerank=same
solo para los nodos 0/1 y los nodos 2/3. - Quité todos los pesos
- Lo más importante es que agregué la
constraint=false
a los bordes que van en contra de la dirección del gráfico: el que va del nodo 4 al nodo 5 y el del nodo 6 al nodo 3.
Aquí la fuente:
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];
}
Y aquí está el resultado:
Ahora, si quieres, puedes mantener rankdir=LR
, solo toma el marcado que publicaste, elimina los pesos y agrega una constraint=false
a los mismos bordes que yo, también funciona.