我使用networkx从边缘创建图形,这些边是节点对。问题是,有时对重复,但它们是一个分离的边缘。
所以在下面的例子中,每个链接都是一个独立的跳,我们将流量从c:3发送到d:4,作为STM-16,然后返回到STM-4,返回到c:3,然后发送到e:5。所以我想把所有这些都用一条直线表示。
两个节点之间的每个链接都是不同的,并且有一个独立的链接标签。
示例:
edgeList=[]
start_time = time.time()
G = nx.Graph()
G.add_edges_from([
(('a:1'), ('b:2'), {'link':'one'}),
(('b:2'), ('c:3'), {'link':'two'}),
(('c:3'), ('d:4'), {'link':'three'}),
(('d:4'), ('c:3'), {'link':'four'}),
(('c:3'), ('e:5'), {'link':'five'})
])
nx.draw(G, with_labels=True)
plt.savefig("path.png")
plt.show()这给了我:图输出
我要找的是一条直线,我想从
a:1>>b:2>>c:3>>d:4>>c:3>>e:5
在C3用一条直线而不是叉子
我不能使用DiGraph,因为我没有方向,我有一个无序的集合(node1,node2,linkname)
另外,我不能更改节点名称,它们稍后会被用于提取一组节点属性
发布于 2019-02-25 18:05:43
您违反了图的一个基本属性:给定的标签唯一地标识节点。你告诉networkx“回到c:3",它完全按照你说的做了。
首先,理解一个图的本质:所有这些边同时存在。当你绘制图表时,在图片中没有线性排序。没有“回到”,只有一端有箭头的边缘。
你的基本图论矛盾就在这里:
we send traffic from c:3 to d:4 as STM-16
and it comes back groomed down to STM-4
back to c:3 where it is sent on to e:5您给了两个不同的节点相同的标签。在图中,这意味着它们是相同的状态,但是您的描述清楚地表明您期望不同的操作。总之,下定决心吧。如果它们需要不同的操作,那么它们是不同的状态,您必须在图形规范中这样描述它们。如果您的工厂恰好将这两个步骤放置在同一个物理位置,那么这就是工厂建设中的问题,而不是这个图形化实用程序的担心。:-)
我看到两个基本的选择:
(1)用描述性的方式标注你的步骤。返回位置c实际上是步骤5,而不是返回步骤3。
G.add_edges_from([
(('a:1'), ('b:2'), {'link':'one'}),
(('b:2'), ('c:3'), {'link':'two'}),
(('c:3'), ('d:4'), {'link':'three'}),
(('d:4'), ('c:5'), {'link':'four'}),
(('c:5'), ('e:6'), {'link':'five'})
])(2)给networkx一个用您的术语描述事物的标签,但是使用不显示的装饰:
G.add_edges_from([
(('a:1'), ('b:2'), {'link':'one'}),
(('b:2'), ('c:3'), {'link':'two'}),
(('c:3'), ('d:4'), {'link':'three'}),
(('d:4'), (' c:3 '), {'link':'four'}),
((' c:3 '), ('e:5'), {'link':'five'})
])我不确定这是否会特别愚弄networkx,但试试看。如果不起作用,请尝试使用下划线或句点。在最坏的情况下,也许"c:3.1“和"c:3.2”可以满足您的需要。
https://stackoverflow.com/questions/54871897
复制相似问题