如何在Networkx/Graphviz中绘制平行边?

6
我正在尝试使用NetworkX在两个节点之间添加平行边,但是出现了以下错误。我做错了什么?
import networkx as nx
import graphviz

g1 = nx.MultiGraph()

node1 = 'a'
node2 = 'b'

g1.add_edge(node1,node2,key='one')
g1.add_edge(node1,node2,key='two')

A = nx.to_agraph(g1)
A.add_subgraph()

A.draw('test2.png', prog='dot')

错误:

Traceback (most recent call last):
  File "test2.py", line 12, in <module>
    A = nx.to_agraph(g1)
  File "C:\python27\lib\site-packages\networkx-1.11rc1-py2.7.egg\networkx\drawing\nx_agraph.py", line 152, in to_agraph
    A.add_edge(u,v,key=str(key),**str_edgedata)
  File "C:\python27\lib\site-packages\pygraphviz\agraph.py", line 481, in add_edge
    eh = gv.agedge(self.handle, uh, vh, key, _Action.find)
KeyError: 'agedge: no key'

这是一个很老的问题,但我认为networkx DiGraphs不允许并行边。因此,当您添加键为“two”的边时,它实际上并没有被添加到图中。 - Jon
2个回答

4

您可以不使用Graphviz来完成相同的操作。我是通过在nx.draw中添加connectionstyle来实现的:

import networkx as nx

g1 = nx.DiGraph(directed=True)

node1 = 'a'
node2 = 'b'

g1.add_edge(node1,node2,key=1)
g1.add_edge(node2,node1,key=2)

nx.draw(g1, with_labels=True, arrows = True, connectionstyle='arc3, rad = 0.1')

See here the result


1
你的代码运行正常,我附上了输出图片。

enter image description here


谢谢你的回复,阿卜杜拉。那个方法不起作用。它仍然给我同样的错误。你有实际尝试过那段代码吗?它对你有效吗? - TraderMoe
抱歉,我的错,我犯了一个错误。 - Abdallah Sobehy
是的,第一次我没有复制/粘贴我的节点定义。但它仍然不起作用。我知道我的语法是正确的,因为如果我使两个键成为相同的值,它不会抛出关于语法的错误。也许我在安装软件包时漏掉了某些东西。 - TraderMoe
实际上你的代码运行成功了,我已经附上了图片,也许你可以尝试重新安装一下相关的软件包。 - Abdallah Sobehy
我也尝试了这段代码,它可以工作,但是在我的情况下应该导入pygraphviz - Kirell
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接