如何反转Graphviz(点语言)图形中每条边的方向?

如何反转Graphviz(点语言)图形中每条边的方向?,graphviz,dot,Graphviz,Dot,我有一个用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)来保留任何现有的边

我有一个用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
以箭头向后的方式渲染图形;我真的需要一个边反转的图。(在这种情况下,我打算反转边,应用
修剪
,然后再次反转边。)


如何反转Graphviz(
dot
-language)图形中每条边的方向?

到目前为止,我想到的最好的方法是

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
调用它

这确实为所有结果边添加了一个“键”属性,但我不确定如何避免这种情况,并且仍然在同一对节点之间保留多条边

当我做有向图G{A->B[label=“foo”];A->B[label=“bar”];B->A;C;}时,我得到:

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

我不知道这将证明有多强大,但它看起来很有希望。

Python库NetworkX有一个定向多重图类型,即多重有向图,它有一个()方法。它还使用pydot加载和写入点文件。

最简单的方法是包含一个图形级别的
dir
语句,在该语句中可以反转箭头的方向。默认情况下,方向为向前。如果在图形的顶部将其反转,则在不更改任何其他行的情况下,图形将以您想要的方式显示

您现在拥有的是:

digraph G
{
    edge [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;
}

我认为您必须在边上设置属性,而不是整个图形。如下所示:
edge[dir=“back”]是的,@ScottMcIntyre是对的:您必须放置一个
边[dir=“back”]指令位于图形主体的开头,以使其正常工作。