2012-04-13 45 views
1

Graphvizのdot言語で指定された有向グラフを持っています。私は、自動的にそのエッジを持つグラフにこれを処理したいGraphviz(ドット言語)グラフのすべてのエッジの向きを逆にするにはどうすればいいですか?

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

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

すなわち、逆に私は堅牢なソリューションを使用したいと思います(グラフを理解し、したがって、おそらくないつまり1既存のエッジラベルやその他の属性を保持します)。私は単に矢印を逆にしてグラフをレンダリングすることをdotに話すことではないことに注意してください。私は本当にエッジが反転したグラフが必要です。 (この場合、エッジを逆にして、pruneを適用して、エッジを再度反転してください)

Graphviz(dot -language)グラフのすべてのエッジの向きを逆にするにはどうすればよいですか?

答えて

2

私がこれまでに作ってみた最高のは、私はその後、gvprで呼び出す

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; 
} 

です。

これはすべての合成エッジに「キー」属性を追加しますが、これを回避し、同じノードのペア間で複数のエッジを保持する方法はわかりません。

私はecho 'digraph G { A -> B [label="foo"]; A -> B [label="bar"]; B -> A; C; }' | gvpr -f reverseAllEdges.gvprを行うと、私が手:

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

私はこれがあることを証明する方法が堅牢わかりませんが、それは有望に見えます。

0

PythonライブラリNetworkXには、reverse()メソッドを持つDirectDrive MultiGraph型のMultiDiGraphがあります。また、DOTファイルのロードと書き込みにはpydotを使用します。

0

最も簡単な方法は、矢印の方向を逆転させるグラフレベルのdirステートメントを含めることです。デフォルトでは、方向はforwardです。グラフの一番上でそれを逆にすると、他の一つの行を変更することなく、グラフがあなたの望むように表示されます。あなたが今持っている何

はこれです:

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

あなたが欲しい何これです:

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

私はあなたがエッジ全体ではなく、グラフに属性を設定することがあると思います。このように: 'edge [dir =" back "];' –

関連する問題