我正在使用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)的无序集合
此外,我无法更改节点名称,以后将它们用于引入一组节点属性
答案 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”会满足您的需求。