如何根据它们的权重在networkx中对边进行排序

7

我正在使用Python中的NetworkX进行网络分析。我需要为每条边确定权重并按以下方式将其添加到图形中:

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np


airports = ['ATL','LAX','ORD']
weights  = [500,200,150] #Note that in my real code I I calculated these weights, they are not provided
G = nx.Graph()
G.add_nodes_from(airports)

weightlst = []
airports_pos = []
checked_airports = []

i = 0
for airport1 in airports:
    for airport2 in airports:
        if airport1 != airport2 and  checked_airports.count([airport1,airport2])==0 and checked_airports.count([airport2,airport1])==0:
            weightedge = weights[i]
            weightlst.append(weightedge)
            weightedge = weightedge*0.0020+0.5
            G.add_edge(airport1, airport2, weight=weightedge)
    checked_airports.append([airport1,airport2])
    i = i + 1

为了更好的理解,每条边所代表的权重表示两个机场之间有多少次航班往返。我的问题在于,由于无关紧要的边线被画在相关的线上面,使得我们难以看出哪些“航线”最繁忙。我希望将权重最高的边线最后绘制,这样就清晰明了地显示出网络中哪些是“最繁忙的航班路线”。


你为什么想要改变添加边的顺序?你希望你的图能够在每对节点之间有多个边吗? - Alex Hall
我有一个由30个节点和435条边组成的网络。为了能够以适当的方式可视化这个网络,我希望将权重较高的边绘制在权重较小的边上方,以便清晰地看到它们(请注意,我还使用颜色渐变,即:权重越高,边缘颜色越深)。 - rational-pi
3个回答

11

使用:

edges=sorted(G.edges(data=True), key=lambda edge: edge[2].get('weight', 1))

key=lambda 代表什么意思? - Joe
key是一个参数,必须用描述排序方式的函数进行初始化。lambda用于定义该函数。 - Hajar Homayouni
key是一个参数,必须用一个函数初始化,描述排序的方式。lambda用于定义该函数。 - undefined

1
补充一下选定答案,因为它可能会感觉有些复杂...(由于声望不足而无法评论,并且编辑请求被拒绝 ¯\(ツ)/¯) G.edges返回添加到图G中的边的列表(每个边由两个元素组成的元组表示:起始节点和结束节点),将其data属性设置为True,则将该列表中为每个边设置的权重作为第三个元素的字典包括在内,其中权重的键是为边权设置的属性名称(默认为'weight')。
Lambda函数通过获取对应于键'weight'的值来评估每个元组t并通过第三个元素(即字典)进行比较,如果未找到该键,则默认为1。
需要翻译的内容:

需要注意的是,如果您选择了除 'weight' 以外的属性名称作为边缘权重,则上面的代码行将无法正常工作,也不会显示任何错误,它只会什么都不做;因为它会默认在所有情况下返回 1,因为它找不到键,因此不能有效地进行排序。一条边可以具有不同解释的不同属性,因此请根据您希望进行排序的键来选择键。


0
将所有边缘数据放入列表中,然后使用自定义键函数进行排序(这非常容易查找)。NetworkX可能没有任何功能可以做到你想要的,因为它不需要。

1
这将给我一个排序后的权重列表,但我的边的排列方式没有改变,这将导致我的边以错误的权重绘制。 - rational-pi
@Kees'tHooft 不,我不是在说一个权重列表,我是在说一个列表,其中每个项目都包含权重和两个节点,并且您按权重进行排序。 - Alex Hall
你能否给我提供一个基本的代码示例来实现这个?我理解你的推理,并尝试编写能够执行你在之前评论中所说的操作的代码,但我的代码无法正常工作。我认为一个示例将有助于我理清事情。谢谢你的帮助。 - rational-pi
我已经从我的程序中提取了相关部分: - rational-pi

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