我有一个用Graphviz的dot
语言指定的有向图,例如
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; }
我想使用一个强大的解决方案(即理解图形的解决方案,因此可能不使用sed
)来保留任何现有的边缘标签和其他属性。请注意,我不仅仅是在谈论让dot
渲染我的图表时箭头指向后方;我真的需要一个边缘相反的图形。 (在这种情况下,我打算反转边缘,应用prune
,然后再次反转边缘。)
如何在Graphviz(dot
- 语言)图表中反转每条边的方向?
答案 0 :(得分:2)
到目前为止,我提出的最好的是
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;
}
然后我用gvpr
调用。
这会添加一个"键"归因于所有结果边,但我不确定如何避免这种情况,并且仍保留同一对节点之间的多条边。
当我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;
}
我不知道这会有多强大,但看起来很有希望。
答案 1 :(得分:2)
最简单的方法是在图表级dir
语句中包含反转箭头方向的语句。默认情况下,方向为forward
。如果您在图表顶部将其反转,则不会更改其他任何一行,图表将以您希望的方式显示。
你现在拥有的是:
digraph G
{
dir="forward"; /* implied */
A -> B [label="foo"];
A -> B [label="bar"];
B -> A;
C;
}
你想要的是这个:
digraph G
{
edge [dir="back"]; /* note the change to this line */
A -> B [label="foo"];
A -> B [label="bar"];
B -> A;
C;
}
答案 2 :(得分:0)
Python库NetworkX有一个有向多图类型MultiDiGraph,它有一个reverse()方法。它还使用pydot来加载和写入DOT文件。