2017-10-12 3 views
3

Ich habe zwei Listen. Einer von ihnen hat diese Datenstruktur: In jeder Zeile ist das erste Element die ID, die zweite die E-Mail-Adresse.Warum zeigt mein networkx-Diagramm keine Kanten zwischen den Knoten an?

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

die zweite Liste ist eine Liste „wer mit wem schrieb“, in jeder Reihe mit der ersten ID-Nummer des Sender ist, und der zweite ist der Empfänger

 ['0', '4'] 
    ['0', '6'] 
    ['1', '4'] 

Btw, die Halterungen nicht wirklich Teil der Listen. Das ist mein Jupyter-Notebook-Ausgang. die erste Liste hat ungefähr 2000 und die zweite Liste hat 40000 Zeilen. Im folgenden Code füge ich die Knoten - in diesem Fall die E-Mail-Adressen - aus der ersten Liste hinzu. und dann gehe ich durch die zweite Liste und verwende die gegebenen IDs, um Kanten zwischen den Knoten zu erzeugen.

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() 

Allerdings kann ich die Kanten zwischen den Knoten nicht sehen. Der obige Code erzeugt den folgenden Graphen. Drucken mit edges() gibt mir die Liste aller Kanten, also kein Problem. Was fehlt mir hier?

Graph

+0

einfach einen Kommentar. Diese for-Schleife ist wegen der gesamten Indexierung schwer zu lesen. 'für i im Bereich (len (idsList)) ...' Wie wäre es mit 'für Index, ID in Enumerate (IDsList): wenn ID [0] == Zeile [0]: erste = Index Elif ID [0] = row [0]: second = index' – Joel

Antwort

1

Ihr Diagramm zur Zeit ungerichtete aussieht. Sie sollten dies ändern und es zu einem gerichteten Graph machen, wenn Sie es nicht ungerichtet machen wollen. das sollte es lösen.

g = nx.DiGraph() 
+0

thx das hat funktioniert! – artre

0

Es könnte ein Problem mit der neuesten Generation sein. sec ist zum Beispiel nicht definiert, und first oder second könnte von einer vorherigen Iteration beibehalten werden.

Wenn Sie Ihre erste Liste in eine dict konvertieren, werden Sie nicht eine zweite Schleife benötigen. Hier ist ein schneller Weg, um Ihr Diagramm zu definieren:

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() 

Es gibt: enter image description here

+0

@ Reti43: Ich habe zuerst die Schlüssel in Integer konvertiert, so dass das Verständnis notwendig war. Aktualisiert. Vielen Dank! –

+0

@EricDuminil: Ich habe deinen Weg mit meinen eigenen l1 und l2 versucht, aber ohne Erfolg. Der Graph, den er erzeugt hat, ist dem Graph, den ich oben gepostet habe, sehr ähnlich. so noch keine sichtbaren Kanten .. – artre

+0

@artre: Könnten Sie bitte noch einige Daten veröffentlichen, sagen wir mal, 20 Knoten und 100 Kanten? Dies sollte mehr als genug sein, um zu prüfen, was das Problem sein könnte. –

Verwandte Themen