Построить график NetworkX из матрицы смежности в CSV-файле
Я немного боролся с этой проблемой, я знаю, что это очень просто, но у меня мало опыта работы с Python или NetworkX. Мой вопрос очень простой, я пытаюсь построить большой набор данных (около 200 строк/столбцов) матрицы, которая выглядит вот так. Первая строка и первый столбец идентичны.
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
это просто матрица, показывающая, как люди связаны, и все, что я хочу, это импортировать и построить этот файл csv, с соответствующим этикетки в NetworkX.
у меня есть этот файл (people.cs
v), и, глядя на предыдущие ответы здесь, кажется, лучший способ сделать это-поместить данные в массив и NumPy.
кажется, есть проблема с этим:
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=',')
Я получаю следующий вывод:
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
2 ответов
Я сделал небольшой csv под названием mycsv.csv, который имеет следующее:
,a,b,c,d
a,0,1,0,1
b,1,0,1,0
c,0,1,0,1
d,1,0,1,0
у вас нет", " как первый символ в первой строке, но вместо этого у вас есть пробел, поэтому, если это ошибка с моей стороны, дайте мне знать. Общая идея будет та же. Читайте в csv как таковом:
from numpy import genfromtxt
import numpy as np
mydata = genfromtxt('mycsv.csv', delimiter=',')
print(mydata)
print(type(mydata))
печатается:
[[ 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'>
теперь, когда у нас есть csv, считанный как массив numpy, нам нужно извлечь только матрицу смежности:
adjacency = mydata[1:,1:]
print(adjacency)
этот принты:
[[ 0. 1. 0. 1.]
[ 1. 0. 1. 0.]
[ 0. 1. 0. 1.]
[ 1. 0. 1. 0.]]
вы можете просто нарезать массив numpy по мере необходимости, если мой маленький пример не совсем такой, как ваш.
чтобы построить график, вам нужно будет импортировать matplotlib и 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')))
на учебник на графиках с python.
это можно сделать легко с помощью pandas
и networkx
.
например, я создал небольшой под названием test.csv
as
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
вы можете прочитать этот файл csv и создать график следующим образом
import pandas as pd
import networkx as nx
input_data = pd.read_csv('test.csv', index_col=0)
G = nx.DiGraph(input_data.values)
для построения этого графика используем
nx.draw(G)
вы получите сюжет, похожий на этот.