2015-04-11 10 views
8

Ich habe mit diesem Problem für ein wenig jetzt gekämpft, ich weiß, das ist sehr einfach - aber ich habe wenig Erfahrung mit Python oder NetworkX. Meine Frage ist sehr einfach, ich versuche, einen großen Datensatz (etwa 200 Zeilen/Spalten) einer Matrix zu erstellen, die so aussieht. Die erste Zeile und die erste Spalte sind identisch.Plot NetworkX Graph von Adjacency Matrix in CSV-Datei

A,B,C,D,E,F,G,H,I,J,K 
A,0,1,1,0,1,1,1,1,0,1,0 
B,1,0,0,0,1,1,1,1,0,1,0 
C,1,0,0,0,1,1,1,1,0,1,0 

Es ist einfach eine Matrix zeigt, wie die Menschen miteinander verbunden sind, und alles, was ich will, ist diese CSV-Datei zu importieren und plotten, mit ihm in NetworkX entsprechenden Etiketten ist.

Ich habe diese Datei (people.cs v), und suchen Sie in früheren Antworten here, so scheint es der beste Weg, dies zu tun ist, indem die Daten in einem Array mit numpy setzen.

Es scheint sich hierbei um ein Problem zu sein:

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

mydata = genfromtxt('mouse.csv', delimiter=',') 

ich folgende Ausgabe:

File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/lib/npyio.py", line 1272, in genfromtxt 
    fhd = iter(np.lib._datasource.open(fname, 'rbU')) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/lib/_datasource.py", line 145, in open 
    return ds.open(path, mode) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/lib/_datasource.py", line 472, in open 
    found = self._findfile(path) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/lib/_datasource.py", line 323, in _findfile 
    if self.exists(name): 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/lib/_datasource.py", line 417, in exists 
    from urllib2 import urlopen 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 94, in <module> 
    import httplib 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 69, in <module> 
    from array import array 
     File "/Users/Plosslab/Documents/PythonStuff/array.py", line 4, in <module> 
     NameError: name 'array' is not defined 

Antwort

10

ich machte einen kleinen csv genannt mycsv.csv, die Folgendes hat:

,a,b,c,d 
a,0,1,0,1 
b,1,0,1,0 
c,0,1,0,1 
d,1,0,1,0 

Sie haben kein ',' als erstes Zeichen in der ersten Zeile, aber stattdessen haben Sie ein Leerzeichen, also wenn das ein Fehler ist o Ich teile es mit. Die allgemeine Idee wird dieselbe sein. Lesen Sie in der csv als solche:

from numpy import genfromtxt 
import numpy as np 
mydata = genfromtxt('mycsv.csv', delimiter=',') 
print(mydata) 
print(type(mydata)) 

Diese Drucke:

[[ nan nan nan nan nan] 
[ nan 0. 1. 0. 1.] 
[ nan 1. 0. 1. 0.] 
[ nan 0. 1. 0. 1.] 
[ nan 1. 0. 1. 0.]] 
<type 'numpy.ndarray'> 

Jetzt, wo wir die csv lesen als numpy Array haben wir nur die Adjazenzmatrix extrahieren müssen:

adjacency = mydata[1:,1:] 
print(adjacency) 

Diese Drucke:

[[ 0. 1. 0. 1.] 
[ 1. 0. 1. 0.] 
[ 0. 1. 0. 1.] 
[ 1. 0. 1. 0.]] 

Y Sie können Ihr numpliges Array nach Bedarf schneiden, wenn mein kleines Beispiel nicht genau so ist wie Ihres.

die Grafik zeichnen Sie matplotlib und NetworkX müssen importiert werden:

import matplotlib.pyplot as plt 
import networkx as nx 

def show_graph_with_labels(adjacency_matrix, mylabels): 
    rows, cols = np.where(adjacency_matrix == 1) 
    edges = zip(rows.tolist(), cols.tolist()) 
    gr = nx.Graph() 
    gr.add_edges_from(edges) 
    nx.draw(gr, node_size=500, labels=mylabels, with_labels=True) 
    plt.show() 

show_graph_with_labels(adjacency, make_label_dict(get_labels('mycsv.csv'))) 

Hier ist eine kurze tutorial auf Graphen mit Python.

graph from csv

+1

Dies ist sehr hilfreich, aber es ist zwingend notwendig, dass die Knoten markiert sind, während genfromtxt, dass ein Teil zu entfernen scheint. – Workhorse

+0

ok Ich werde den Code aktualisieren, damit Sie grundlegende Etiketten erhalten. – Scott

+0

Ich glaube, ich habe es falsch verstanden. Sind die Buchstaben deine Etiketten? Wenn Sie etwas anderes als die Zeilen-/Spaltennummer als Beschriftungen verwenden möchten, können Sie benutzerdefinierte Beschriftungen hinzufügen: https://networkx.github.io/documentation/latest/examples/drawing/labels_and_colors.html – Scott

8

Dies kann durch Verwendung pandas und networkx leicht getan werden.

Zum Beispiel habe ich eine kleine csv Datei test.csv als

genannt erstellt
A,B,C,D,E,F,G,H,I,J,K 
A,0,1,1,0,1,1,1,1,0,1,0 
B,1,0,0,0,1,1,1,1,0,1,0 
C,1,0,0,0,1,1,1,1,0,1,0 
D,0,0,0,0,1,0,1,1,0,1,0 
E,1,0,0,0,1,1,1,1,0,1,0 
F,0,0,1,0,1,0,0,0,0,1,0 
G,1,0,0,0,0,0,0,1,0,0,0 
H,1,0,0,0,1,1,1,0,0,1,0 
I,0,0,0,1,0,0,0,0,0,0,0 
J,1,0,0,0,1,1,1,1,0,1,0 
K,1,0,0,0,1,0,1,0,0,1,0 

Sie diese CSV-Datei lesen und Diagramm erstellen, wie

import pandas as pd 
import networkx as nx 
input_data = pd.read_csv('test.csv', index_col=0) 
G = nx.DiGraph(input_data.values) 

folgt diese Grafik Verwendung zum Plotten

nx.draw(G) 

Sie würden ein Grundstück Somethi bekommen ähnlich.

Output of <code>nx.draw(G)</code>

+0

Ist es nicht notwendig, die erste Zeile mit einem Komma zu beginnen, um anzuzeigen, dass die erste Zelle leer ist? – Sigur