2017-10-12 118 views
3

我有两个列表。其中一个有这样的数据结构:在每一行中,第一个元素是ID,第二个是电子邮件地址。为什么我的networkx图形在节点之间不显示边界?

 ['0', '[email protected]'] 
    ['1','[email protected]'] 

第二列表是“谁写谁”列表中,每一行与第一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

+0

只是一个评论。由于所有的索引,这个for循环很难阅读。 '对于我在范围内(len(idslist))...'如何做 '为索引,身份证在枚举(idsList): 如果id [0] ==行[0]: 第一=索引 ELIF ID [0] = row [0]: second = index' – Joel

回答

1

你的图形看起来目前无向。你应该改变它,并使其成为一个有向图,除非你应该使它无向。那应该解决它。

g = nx.DiGraph() 
+0

thx工作! – artre

0

有可能是您的边生成一个问题。 sec未被定义为例如,并且firstsecond可能与先前的迭代保持不同。

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

import networkx as nx 
import matplotlib.pyplot as plt 

l1 = [ ['0', '[email protected]'], 
    ['1','[email protected]'], 
    ['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() 

它输出: enter image description here

+0

@ Reti43:我首先将键转换为整数,因此需要理解词典。更新。谢谢! –

+0

@EricDuminil:我用我自己的l1和l2尝试了你的方式,但无济于事。它生成的图形与我上面发布的图形非常相似。所以仍然没有可见的边缘.. – artre

+0

@artre:你可以请张贴更多的数据,让我们说20个节点和100个边缘?这应该足以检查问题的可能性。 –