【问题标题】:How to create a graph using a CSV File data?如何使用 CSV 文件数据创建图表?
【发布时间】:2014-08-30 10:47:57
【问题描述】:

我在 CSV 文件中有以下数据,

A,B,50
A,C,34
C,D,55
D,D,80
A,D,90
B,D,78

现在我想创建一个图,其中 A、B、C、D 作为节点,第三列编号作为边。我正在使用 networkx 库。第三列数字显示了 A、B 和 A、C 共享的公共项目,依此类推。

我打开并读取 csv 文件。

Graphs = nx.Graph()

for row in openedfile:
 Graphs.add_node(row[0])
 Graphs.add_edge(row[2])

nx.draw_graphviz(Graphs)

上面的代码给了我一个错误。我无法得到正确的答案。

【问题讨论】:

    标签: python csv graph networkx


    【解决方案1】:

    我不确定我是否理解您文件的格式,因为前两列似乎告诉您应该由一条边连接的节点,而第三列是该边的权重。

    假设是这种情况,将边缘的 CSV 文件加载到 NetworkX 的更简单方法是使用 networkx.read_edgelist 函数。这是您的图表的示例(假设它存储在名为 "edges.txt" 的文件中):

    In [1]: import networkx as nx
    In [2]: G = nx.read_edgelist("edges.txt", delimiter=",", data=[("weight", int)]) 
    In [3]: G.edges(data=True)
    Out[1]: 
    [(u'A', u'C', {'weight': 34}),
     (u'A', u'B', {'weight': 50}),
     (u'A', u'D', {'weight': 90}),
     (u'C', u'D', {'weight': 55}),
     (u'B', u'D', {'weight': 78}),
     (u'D', u'D', {'weight': 80})]
    

    需要注意的重要参数是需要将每一行的分隔符设置为逗号(","),并且需要指定存储在第三列中的数据是整数,应该使用键"weight"

    然后您可以使用权重作为边缘标签来绘制图形,如下所示:

    In [4]: edge_labels = dict( ((u, v), d["weight"]) for u, v, d in G.edges(data=True) )
    In [5]: pos = nx.random_layout(G)
    In [6]: nx.draw(G, pos)
    In [7]: nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
    In [8]: import matplotlib.pyplot as plt; plt.show()
    

    【讨论】:

    • 会绘制图形并显示吗?
    • @GravityM:对不起,我不明白你的问题。我刚刚添加了图表的图像,一旦它被绘制(所以上传它给我带来了麻烦)。
    • 我可以使用 for 循环遍历我的整个文件吗?你能再检查一下这个问题吗?我将您的代码添加到我正在尝试做的事情中。但我认为你的解决方案会奏效。但有一个快速的问题(在问题中更新)
    • @GravityM:是的,您可以循环浏览文件,您只需在 for 循环的正文中执行 G.add_edge( row[0], row[1], weight=int(row[2]))
    • 我正在使用 csv 文件。并使用 opensfile = csv.reader(filepath, delimiter=',') 打开文件
    猜你喜欢
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 2017-11-05
    • 2014-07-27
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多