【问题标题】:How to sort edges in networkx based on their weight如何根据权重对networkx中的边进行排序
【发布时间】:2017-03-17 11:42:36
【问题描述】:

我使用 NetworkX 在 python 中进行网络分析。我确定每条边的权重并通过以下方式将该边添加到图中:

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

对于上下文,每条边的权重表示两个机场之间发生了多少航班,我的问题是不清楚哪些“路线”是“最繁忙的”,因为不相关的边被绘制在相关的边上。我希望最后绘制权重最高的边,以便清楚哪些是网络中“最繁忙的航线”。

【问题讨论】:

  • 为什么要更改添加边的顺序?您是否希望您的图能够每对节点有多个边?
  • 我有一个由 30 个节点组成的网络,因此有 435 个边。为了能够以适当的方式可视化该网络,我希望将具有较高权重的边缘绘制在具有较小权重的边缘之上,以便可以清楚地看到它们(请注意,我还使用了颜​​色渐变,即是:权重越高,边缘颜色越深)。

标签: python networkx


【解决方案1】:

用途:

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

【讨论】:

    【解决方案2】:

    添加到所选答案,因为它可能感觉有些复杂...(由于声誉不足和编辑请求被拒绝,无法发表评论¯\(ツ)/¯)

    G.edges 返回添加到图形G 的边列表(每条边由两个元素的元组表示:开始节点和结束节点) ,将其data 属性设置为True 包括为该列表中的每个边设置的权重作为 tuple 的第三个元素作为字典,其中weight 的 key 是为边缘权重设置的属性名称(默认为'weight')。

    lambda 函数评估每个 tuple t 并通过获取与键 'weight' 对应的值通过第三个元素(即字典)比较它们, 如果找不到该键,则默认为 1。

    需要注意的是,如果你选择了除'weight'之外的属性名称作为边的权重,上面的代码行将不起作用并且也不会显示任何错误,它什么也不做;因为它在所有情况下都默认返回1,因为它找不到密钥,因此实际上什么都不排序。一条边可以有不同解释的不同属性,因此请务必根据您想要排序的键选择键。

    【讨论】:

      【解决方案3】:

      将所有边缘数据放在一个列表中,然后使用自定义键功能对其进行排序(这很容易查找)。 NetworkX 可能没有任何功能可以做你想做的事,因为它不需要。

      【讨论】:

      • 这会给我一个排序的权重列表,但是我的边缘排列方式没有改变,这将导致我的边缘以错误的重量绘制。
      • @Kees'tHooft 不,我不是在谈论权重列表,我说的是每个项目都包含权重和两个节点的列表,并且您按权重排序。
      • 您能否提供一个基本的代码示例来实现这一点。我遵循您的推理,我正在尝试编写代码来执行您在之前的评论中所说的内容,但是我的代码不起作用。我认为一个例子会为我澄清事情。感谢您的帮助
      • 我已经从我的程序中提取了相关部分:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多