Python 当输入节点有冒号时,write_dot(…)生成冗余节点

Python 当输入节点有冒号时,write_dot(…)生成冗余节点,python,graphviz,networkx,pygraphviz,Python,Graphviz,Networkx,Pygraphviz,产生 这是由于冒号引起的 so.dot: import networkx as nx G = nx.DiGraph() G.add_edge("A: test", 'B: test') nx.write_dot(G,'so.dot') 请注意,它会剥离冒号及其后面的所有内容 如果我手动将此更改为 strict digraph G { A; B; "A: test" -> "B: test"; } 很好。事实上,有没有节点并不重要,只要有边就行 如果删除:和t之间的空格,则只生成A

产生

这是由于冒号引起的

so.dot

import networkx as nx

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

nx.write_dot(G,'so.dot')
请注意,它会剥离冒号及其后面的所有内容

如果我手动将此更改为

strict digraph G {
A;
B;
"A: test" -> "B: test";
}
很好。事实上,有没有节点并不重要,只要有边就行

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

我试过用各种方法逃离结肠,但似乎不起作用。显然,我每次都可以手动删除节点,但最好是使用脚本解决方案。(而不是通过.dot文件的第二个脚本)


有人有主意吗?

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

从GraphViz文档中

portPos

指示边在节点上的目标位置的修改器。它的格式为
portname(:compass\u point)
compass\u point
。如果 如果使用第一个表单,则相应的节点必须具有 形状,其中一个字段具有给定的端口名,或具有 类似HTML的标签,其中一个组件的
PORT
属性设置为 端口名

然而,据我们所知,通过向Graphviz传递一个引用的节点名,您可以克服这种行为,例如

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

完美的出于好奇,你是如何找到答案的?什么搜索词?@svdc:这是一个多阶段的过程。:)FWIW,尽管我不是Graphviz/DOT专家,但我已经断断续续地使用它超过10年了(在我开始使用Python之前),所以我已经有了一些搜索Graphviz信息的实践。但我必须承认,我以前不知道港口,或者我只是忘记了它们我从未使用过任何Python Graphviz模块,我的(公认的简单)程序只是直接创建点代码。
G.add_edge("'A: test'", "'B: test'")