Networkx 和 graphviz。如何抑制点输出中的节点和边缘位置?

Networkx and graphviz. How to suppress node and edge positions in dot output?

使用这个简单的 networkx 脚本。

import networkx as nx

g = nx.DiGraph()
g.add_edge("a","b")
g.add_edge("a","c")
g.add_node("D")

dotter = nx.nx_agraph.to_agraph(g)
dotter.layout("dot")
dot = dotter.to_string()

with open("test_w_pos.dot","w") as fo:
    fo.write(dot)

输出为:

strict digraph "" {
    graph [bb="0,0,162,108"];
    node [label="\N"];
    a    [height=0.5,
        pos="63,90",
        width=0.75];
    b    [height=0.5,
        pos="27,18",
        width=0.75];
    a -> b   [pos="e,35.634,35.269 54.285,72.571 50.04,64.081 44.846,53.693 40.134,44.267"];
    c    [height=0.5,
        pos="99,18",
        width=0.75];
    a -> c   [pos="e,90.366,35.269 71.715,72.571 75.96,64.081 81.154,53.693 85.866,44.267"];
    D    [height=0.5,
        pos="135,90",
        width=0.75];
}

我希望具有任何posheightwidth属性,因为它们不同于运行 运行 并且很难在复杂图形上与之前的 运行 进行比较。

期望的输出

strict digraph "" {
    node [label="\N"];
    a;
    b;
    a -> b;
    c;
    a -> c;
    D;
}

两个 dot 文件在 svg 中给出基本相同的输出(见下文),所以我发现定位是不必要的,事实上我从未见过将此信息放入 dot 之前的文件。

我在 to_agraphdotter.to_string 中找不到任何内容,但我没有注意到 dotter.layout(dot):

中可能存在额外的参数

agraph.py

    def layout(self, prog="neato", args=""):
        """Assign positions to nodes in graph.

是的,有了这个非常简单的文件,我可以在之后删除定位数据。但是在真实的图表中,会有很多其他颜色和标签属性与位置混合在一起。

具有位置属性的图像:

没有位置属性的图像:

试试 dotter.layout("canon") (https://graphviz.org/docs/outputs/canon/)。这将提供没有任何定位的(漂亮打印的)图表版本。

如果您只对 dot 文件感兴趣,您可以使用 pydot interface of networkx and call write_dot,例如

drawing.nx_pydot.write_dot(g, "test.dot")