为什么我的 NetworkX 图中节点之间没有显示边?

7
我有两个列表。其中一个具有此数据结构:每行的第一个元素是ID,第二个元素是电子邮件地址。
     ['0', 'kvogel@politico.com']
     ['1','ababab@politico.com']

第二个列表是一个“谁给谁写信”的列表,每行的第一个ID号码是发件人,第二个号码是收件人。
     ['0', '4']
     ['0', '6']
     ['1', '4']

顺便说一下,括号实际上并不是列表的一部分。这是我的Jupyter笔记本输出。第一个列表大约有2000个,第二个列表有40000行。在下面的代码中,我从第一个列表中添加节点(在这种情况下是电子邮件地址),然后循环遍历第二个列表并使用给定的ID创建节点之间的边缘。

    first =-1
    second =-1
    for row in idsList:
         g.add_nodes_from(row[1])
    for row in dncList:
        for i in range (len(idsList)):
            if (row[0]==idsList[i][0]):
                first=i;
            elif(row[1]==idsList[i][0]):
                second=i
        g.add_edge(idsList[first][1],idsList[second][1])
    nx.draw_networkx(g,with_labels = False, node_size = 30)
    plt.show()

然而,我无法看到节点之间的边缘。上述代码生成了下面的图形。使用edges()打印会给出所有边的列表,因此没有问题。我在这里漏掉了什么?

Graph


只是一条注释。这个for循环由于所有的索引而难以阅读。for i in range (len(idsList)) ... 为什么不这样做呢?for index, id in enumerate(idsList): if id[0] == row[0]: first = index elif id[0] == row[0]: second = index - Joel
3个回答

6

您的图表目前看起来是未定向的。除非您打算制作无向图,否则您应该将其更改为有向图。这样应该可以解决问题。

g = nx.DiGraph()

但为什么无向图的边没有显示出来呢? - Eerik Sven Puudist

0

你的边缘生成可能存在问题。例如,sec未定义,而firstsecond可能会保留上一次迭代的值。

如果将第一个列表转换为字典,则不需要第二个循环。以下是定义图形的更快方法:

import networkx as nx
import matplotlib.pyplot as plt

l1 = [ ['0', 'kvogel@politico.com'],
     ['1','ababab@politico.com'],
     ['2','c'],
     ['3','d'],
     ['4','e']
      ]

l2 = [['0', '4'],
     ['0', '2'],
     ['2', '3'],
     ['1', '3'],
     ['1', '2'],
     ['1', '4']]

addresses = dict(l1)

g = nx.Graph()
for address in addresses.values():
    g.add_node(address)

for i1, i2 in l2:
    g.add_edge(addresses[i1], addresses[i2])

nx.draw_networkx(g,with_labels = False, node_size = 30)
plt.show()

它的输出结果为: 输入图像描述

@Reti43:我一开始将键转换为整数,所以需要使用字典推导。已更新。谢谢! - Eric Duminil
@EricDuminil:我用自己的L1和L2尝试了你的方法,但是没有成功。它生成的图形与我上面发布的图形非常相似,仍然没有可见的边缘... - artre
@artre:您能否请发一些更多的数据,比如20个节点和100条边吗?这样应该足够检查问题在哪了。 - Eric Duminil

0
我尝试了几乎与你的代码相同的代码:
idsList = [ 
  ['0', 'kvogel@politico.com'],
  ['1','ababab@politico.com'],
  ['2','foo@example.com'],
  ['3','bar@example.com'],
  ['4','ALPHA@BETA.COM']
  ]
dncList = [
  ['0', '4'],
  ['2', '3'],
  ['1', '3'],
  ['1', '2'],
  ['1', '4']
  ]
g = nx.Graph()
first =-1
second =-1
for row in idsList:
      g.add_nodes_from(row[1])
for row in dncList:
    for i in range (len(idsList)):
        if (row[0]==idsList[i][0]):
            first=i;
        elif(row[1]==idsList[i][0]):
            second=i
    g.add_edge(idsList[first][1],idsList[second][1])
nx.draw_networkx(g,with_labels = True, node_size = 300, node_color='skyblue')
plt.show()

然后得到:

enter image description here

解决方案基本上是使用add_node而不是add_nodes_from,像这样:
g = nx.Graph()
for row in idsList:
  g.add_node(row[0], email=row[1])
for row in dncList:
  g.add_edge(row[0], row[1])
nx.draw_networkx(g,with_labels = True, node_size = 300, node_color='skyblue')
plt.show()

enter image description here


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