【问题标题】:Plot NetworkX Graph from Adjacency Matrix in CSV file从 CSV 文件中的邻接矩阵绘制 NetworkX 图
【发布时间】:2015-06-16 19:59:45
【问题描述】:

我一直在与这个问题作斗争,我知道这很简单——但我对 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

【问题讨论】:

    标签: python csv numpy networkx


    【解决方案1】:

    我制作了一个名为 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')))
    

    这里有一个简短的tutorial 用 python 绘制图表。

    【讨论】:

    • 这很有帮助,但必须标记节点,而 genfromtxt 似乎删除了该部分。
    • 我想我误解了。字母是你的标签吗?如果您想使用除行号/列号以外的其他内容作为标签,您可以添加自定义标签:networkx.github.io/documentation/latest/examples/drawing/…
    • 我终于运行了这段代码,我得到了很多错误:` File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/lib/npyio .py",第 1272 行,在 genfromtxt fhd = iter(np.lib._datasource.open(fname, 'rbU')) NameError: name 'array' is not defined`
    • 说你有错误不是一个有用的评论。你得到了什么错误?你能回答我之前关于你期望什么标签的问题吗?
    • 似乎如果某个节点没有边,使用此方法该节点将不会出现在图中。
    【解决方案2】:

    这可以通过使用pandasnetworkx 轻松完成。

    例如,我创建了一个名为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)
    

    你会得到一个类似的情节。

    【讨论】:

    • 第一行不用逗号开头就表示第一个单元格是空的吗?
    【解决方案3】:

    这与Scott's excellent answer 相同,但可以正确处理没有边的节点。

    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()
        all_rows = range(0, adjacency_matrix.shape[0])
        for n in all_rows:
            gr.add_node(n)
        gr.add_edges_from(edges)
        nx.draw(gr, node_size=900, labels=mylabels, with_labels=True)
        plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多