import networkx as nx
G = nx.DiGraph()
G.add_edge("A: test", 'B: test')
nx.write_dot(G,'so.dot')
制作
这是由于结肠。
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文件的第二个脚本)
有人有想法吗?
答案 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'")