3
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";
}

没关系。其实有没有节点没关系,只要有边就行。

如果我删除 and 之间的空格:t则只生成 A 和 B 。

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

有人有想法吗?

4

1 回答 1

6

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

来自 GraphViz 文档,节点、边和图形属性

端口位置

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

但是,根据这个答案,您可以通过向 Graphviz 传递带引号的节点名称来覆盖此行为,例如,

G.add_edge("'A: test'", "'B: test'")
于 2015-11-15T18:05:18.743 回答