2012-04-13 8 views
1

Ich habe eine gerichtete Grafik in Graphviz dot Sprache, z.Wie kann ich die Richtung jeder Kante in einer Graphviz (Punktsprache) Grafik umkehren?

digraph G { A -> B [label="foo"]; A -> B [label="bar"]; B -> A; C; } 

Ich möchte dies mit seinen Kanten in einem Graphen automatisch verarbeiten, umgekehrt, dh

digraph G { B -> A [label="foo"]; B -> A [label="bar"]; A -> B; C; } 

ich eine robuste Lösung verwenden möchten (dh eine, die die Grafik versteht und daher tut wahrscheinlich nicht Verwenden Sie sed), wobei vorhandene Kantenbeschriftungen und andere Attribute beibehalten werden. Beachten Sie, dass ich nicht nur davon spreche, dot zu erhalten, um mein Diagramm mit den nach hinten zeigenden Pfeilen zu rendern; Ich brauche wirklich einen Graphen, dessen Kanten vertauscht sind. (In diesem Fall beabsichtige ich, die Kanten umzukehren, appliziere prune und kehre dann die Kanten wieder um.)

Wie kann ich die Richtung jeder Kante in einem Graphviz (dot -language) Diagramm umkehren?

Antwort

2

Das Beste, was ich mit so habe kommen weit ist

BEG_G { 
    graph_t g = graph($.name + " reversed", "D"); 
    int edge_id = 0; 
} 

N { 
    clone(g, $); 
} 

E { 
    node_t newHead = clone(g, $.head); 
    node_t newTail = clone(g, $.tail); 
    edge_t newEdge = edge_sg(g, newHead, newTail, edge_id); 
    copyA($, newEdge); 
    edge_id++; 
} 

END_G { 
    $O = g; 
} 

, die ich mit gvpr dann aufrufen.

einen „Schlüssel“ Attribut für alle sich ergebenden Kanten Dies fügt, aber ich bin nicht sicher, wie das zu vermeiden und noch mehrere Kanten zwischen dem gleichen Paar von Knoten zu bewahren.

Wenn ich echo 'digraph G { A -> B [label="foo"]; A -> B [label="bar"]; B -> A; C; }' | gvpr -f reverseAllEdges.gvpr tun, erhalte ich:

digraph "G reversed" { 
    A -> B [key=2]; 
    B -> A [key=0, label=foo]; 
    B -> A [key=1, label=bar]; 
    C; 
} 

Ich weiß nicht, wie robust diese erweisen werden, aber es sieht vielversprechend aus.

0

Die Python Bibliothek NetworkX hat einen gerichteten Multigraph-Typ, MultiDiGraph, die eine reverse() Methode hat. Es verwendet auch Pydot zum Laden und Schreiben von DOT-Dateien.

0

Der einfachste Weg ist ein Graph-Ebene dir Aussage aufzunehmen, wo Sie die Richtung der Pfeile umkehren. Standardmäßig lautet die Richtung forward. Wenn Sie es oben in Ihrem Diagramm umkehren, wird das Diagramm so angezeigt, wie Sie es möchten, ohne eine andere Zeile zu ändern.

Was Sie jetzt haben, ist dies:

digraph G 
{ 
    dir="forward"; /* implied */ 
    A -> B [label="foo"]; 
    A -> B [label="bar"]; 
    B -> A; 
    C; 
} 

Was Sie wollen, ist dies:

digraph G 
{ 
    dir="back"; /* note the change to this line */ 
    A -> B [label="foo"]; 
    A -> B [label="bar"]; 
    B -> A; 
    C; 
} 
+3

Ich glaube, Sie das Attribut auf Kanten setzen müssen, nicht den ganzen Graphen. Wie folgt: 'edge [dir =" zurück "];' –

Verwandte Themen