当输入节点有冒号时,nx.write_dot(...)会生成冗余节点

时间:2015-11-15 17:41:07

标签: python graphviz networkx pygraphviz

import networkx as nx

G = nx.DiGraph()
G.add_edge("A: test", 'B: test')

nx.write_dot(G,'so.dot')

制作

http://oi67.tinypic.com/2hrzrx3.jpg

这是由于结肠。

so.dot

strict digraph G {
A;
B;
"A: test" -> "B: test";
}

请注意它会剥离冒号及其背后的所有内容。

如果我手动将其更改为

strict digraph G {
"A: test";
"B: test";
"A: test" -> "B: test";
}

没关系。事实上,只要存在边缘,是否存在节点并不重要。

如果删除:t之间的空格,则只会生成A和B.

我试过以各种方式逃避冒号,但这似乎不起作用。显然,我每次都可以手动删除节点,但脚本解决方案更可取。 (而不是通过.dot文件的第二个脚本)

有人有想法吗?

1 个答案:

答案 0 :(得分:5)

这不是一个错误,它是GraphViz Dot语言语法的一个特性。节点名称中的冒号用于指定输入或输出端口。

来自GraphViz文档,Node, Edge and Graph Attributes

  

<强> portPos

     

修饰符,指示边缘应在哪个节点上进行目标。它的格式为portname(:compass_point)?compass_point。如果   使用第一个表单,相应的节点必须具有记录   形状,其中一个字段具有给定的端口名,或者具有   类似HTML的标签,其中一个组件的PORT属性设置为   端口名

但是,根据this answer,您可以通过传递Graphviz引用的节点名称来覆盖此行为,例如,

G.add_edge("'A: test'", "'B: test'")