web-dev-qa-db-ja.com

CSVファイルの隣接行列からNetworkXグラフをプロット

私はこの問題と少しの間戦っていますが、これは非常に単純であることを知っています-しかし、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.csv)、そして以前の答え here を見ると、これを行う最良の方法は、データを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
16
Workhorse

私はmycsv.csvと呼ばれる小さな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を使用したグラフの短い tutorial を次に示します。

graph from csv

22
Scott

これは、pandasおよびnetworkxを使用して簡単に行うことができます。

たとえば、test.csvという小さな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
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)

あなたはこれに似たプロットを得るでしょう。

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

14
Abinash Panda