2015-04-11 31 views
8

Ho combattuto con questo problema per un po 'ora, so che è molto semplice - ma ho poca esperienza con Python o NetworkX. La mia domanda è molto semplice, sto provando a tracciare un grande set di dati (circa 200 righe/colonne) di una matrice che assomiglia a questo. La prima riga e la prima colonna sono identiche.Plot Grafico di reteX dalla matrice di adiacenza nel file CSV

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 

E 'solo una matrice che mostra come le persone sono connesse, e tutto quello che voglio è quello di importare e tracciare questo file CSV, con il suo etichette corrispondenti in NetworkX.

devo questo file (people.cs v), e guardando le risposte precedenti here, sembra il modo migliore per farlo è mettendo i dati in un array con NumPy.

Sembra esserci un problema con questo:

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=',') 

ottengo il seguente output:

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 

risposta

10

ho fatto un piccolo csv chiamato mycsv.csv che ha il seguente:

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

Non hai un ',' come il primo carattere sulla prima riga, ma invece hai uno spazio, quindi se questo è un errore o Da parte mia fammi sapere. L'idea generale sarà la stessa. Leggiamo nel CSV in quanto tale:

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

Questo stampa:

[[ 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'> 

Ora che abbiamo il csv leggiamo come una matrice NumPy abbiamo bisogno di estrarre solo la matrice di adiacenza:

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

Questo stampa:

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

Y Puoi semplicemente tagliare la tua matrice numpy se necessario se il mio piccolo esempio non è esattamente come il tuo.

per tracciare il grafico è necessario importare matplotlib e NetworkX:

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

Ecco un breve tutorial su grafici con Python.

graph from csv

+1

Questo è molto utile, ma è imperativo che i nodi sono etichettati, mentre genfromtxt sembra per rimuovere quella parte. – Workhorse

+0

ok aggiornerò il codice in modo da ottenere le etichette di base. – Scott

+0

Penso di aver frainteso. Le lettere sono le tue etichette? Se si desidera utilizzare qualcosa di diverso dal numero di riga/codice come etichette, è possibile aggiungere etichette personalizzate: https://networkx.github.io/documentation/latest/examples/drawing/labels_and_colors.html – Scott

8

questo può essere fatto facilmente utilizzando pandas e networkx.

Per esempio, ho creato un piccolo csv file chiamato test.csv come

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 

Si può leggere questo file CSV e creare grafico come segue

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

Per tracciare questo uso grafico

nx.draw(G) 

Si otterrebbe una trama somethi simile a questo.

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

+0

Non è necessario iniziare la prima riga con la virgola per indicare che la prima cella è vuota? – Sigur