将相同节点之间的边视为不同

时间:2019-02-25 17:45:48

标签: python networkx

我正在使用networkx从成对的节点边缘创建图形。问题在于,有时两对重复,但它们是分开的边缘。

因此在下面的示例中,每个链接都是一个单独的跃点,我们在STM-16上将流量从c:3发送到d:4,然后将其整理回到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()

这给了我: graph output

我要寻找的是一条直线,我想从这里走

a:1 >> b:2 >> c:3 >> d:4 >> c:3 >> e:5

在直线上而不是在C3处分叉

我无法使用DiGraph,因为我没有方向,我有(node1,node2,linkname)的无序集合

此外,我无法更改节点名称,以后将它们用于引入一组节点属性

1 个答案:

答案 0 :(得分:1)

您违反了图的基本属性:给定标签唯一标识一个节点。您告诉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”会满足您的需求。