私はこの問題と少しの間戦っていますが、これは非常に単純であることを知っています-しかし、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)、そして以前の答え 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
私は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 を次に示します。
これは、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)
あなたはこれに似たプロットを得るでしょう。