How do I add edges between two subgraphs in pydot?
有人知道如何在pydot中的两个子图(簇)之间添加边吗?
1 2 3 4 5 6 7 8
| callgraph = pydot.Dot(graph_type='digraph',fontname="Verdana")
cluster_foo=pydot.Cluster('foo',label='foo')
cluster_foo.add_node(pydot.Node('foo_method_1',label='method_1'))
callgraph.add_subgraph(cluster_foo)
cluster_bar=pydot.Cluster('bar',label='Component1')
cluster_bar.add_node(pydot.Node('bar_method_a'))
callgraph.add_subgraph(cluster_bar) |
我尝试过:
1
| callgraph.add_edge(pydot.Edge("foo","bar")) |
但不起作用。它只是在初始图中再创建两个标记为" foo "和" bar "的节点,并在它们之间放置一条边!
任何人都可以帮忙吗?
-
Graphviz要求边缘在2个群集中的节点之间。
-
添加图形参数compound ='true'。
-
使用边缘参数lhead =和ltail =。
因此您的代码将变为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| callgraph = pydot.Dot(graph_type='digraph', fontname="Verdana", compound='true')
cluster_foo=pydot.Cluster('foo',label='foo')
callgraph.add_subgraph(cluster_foo)
node_foo = pydot.Node('foo_method_1',label='method_1')
cluster_foo.add_node(node_foo)
cluster_bar=pydot.Cluster('bar',label='Component1')
callgraph.add_subgraph(cluster_bar)
node_bar = pydot.Node('bar_method_a')
cluster_bar.add_node(node_bar)
callgraph.add_edge(pydot.Edge(node_foo, node_bar, ltail=cluster_foo.get_name(), lhead=cluster_bar.get_name())) |
- Edge()调用似乎有点不正确:它使用边名称foo_method_1,bar_method_a,而不是节点实例。当您的版本尝试转换为点文件时,将导致pydot中出现未处理的运行时错误。
-
事实证明,在这个问题上pydot的文档很少。没错,pydot.Edge()文档字符串将其描述为采用纯节点名称字符串,根本没有提到pydot.Node对象。但是,实际的Edge类确实包含接受Node对象的代码,以替代纯字符串。 pydot.py中处理它们的相关代码为:if isinstance(src, Node): src = src.get_name() if isinstance(dst, Node): dst = dst.get_name()因此,以上的答案代码毕竟可以正常工作。 (当时已经过测试,只是为了确保。)
-
总的来说,我对避免超出API文档所做出的Promise非常严格,因此:感谢您注意并大声疾呼!就是说,在这种特定情况下,我非常确定这只是文档的一部分,并且pydot对Edge(Node(...))的支持是官方打算提供的稳定功能。例如,否则Edge()和Graph.add_node()将具有令人困惑的冲突调用约定。 Google在" pydot示例"中排名前2位的热门歌曲实际上都使用了pydot的此功能。
-
就我而言,它不受支持,即它在我编写时给出了运行时异常-这可能与我使用的pydot版本有关:1.0.28。您有哪一个(pip freeze | grep pydot)?
-
早在2011年,我可能用1.0.2或1.0.4进行了测试。刚才我使用Ubuntu 15.04的python-pydot软件包1.0.28进行了测试。根据Github的说法,该功能是在1.0.2版中引入的:github.com/erocarrera/pydot/commit/…。当我用pip测试它时:virtualenv test-pydot-B; source test-pydot-B/bin/activate; pip install pydot; pip freeze我得到了pydot==1.0.2。通过该路径安装软件包时,该功能也可以使用。
-
当我通过以下操作强制pip安装1.0.28时:stackoverflow.com/questions/22868777/…(为了安全起见,在我的一次性计算机上),Edge(Node(...), ...)功能也可以在其中使用。但是,那个SO问题表明pydot的package/分发目前可能不是很理想。 PyPI还仍然链接到已过时的code.google.com(重定向到Github)。您是否可以仔细检查计算机上pydot.py文件的实际内容是否与您独立下载的1.0.28代码的副本匹配?
-
好的,我再次测试过,现在无法重现了。我认为它一定与我正在修复的其他错误有关,但是我没有进行足够的提交来找到它破裂的状态。我记得我从pydot收到了一条异常消息,该消息是节点参数的类型错误(预期的字符串,找到的实例)。但是,当我通过示例传递节点时,它可以正常工作-对不起。
-
没问题;我已经向Ero Carrera以及davidvilla的fork提交了一个小的文档更新,因此希望我们最终能脱颖而出。 (我唯一担心的是Pydot显示出不再被维护的多种迹象,并且似乎已经分裂为至少3个有重大变化的分支。但是我们会看到的。)