【问题标题】:Networkx : How to create graph edges from a csv file?Networkx:如何从 csv 文件创建图形边缘?
【发布时间】:2016-01-30 10:35:51
【问题描述】:

我正在尝试使用 networkx 创建一个图形,到目前为止,我已经从以下文本文件创建了节点: 文件 1(user_id.txt) 样本数据:

user_000001
user_000002
user_000003
user_000004
user_000005
user_000006
user_000007

文件 2(user_country.txt) 示例数据:如果用户没有输入他的国家详细信息,也包含几个空白行

 Japan
 Peru
 United States

 Bulgaria
 Russian Federation
 United States

文件 3(user_agegroup.txt) 数据:包含四个年龄组

 [12-18],[19-25],[26-32],[33-39]

我还有另外两个文件,其中包含用于在图中添加边的示例数据

文件 4(id,agegroup.txt)

user_000001,[19-25]
user_000002,[19-25]
user_000003,[33-39]
user_000004,[19-25]
user_000005,[19-25]
user_000006,[19-25]
user_000007,[26-32]

文件 5(id,country.txt)

(user_000001,Japan)
(user_000002,Peru)
(user_000003,United States)
(user_000004,)
(user_000005,Bulgaria)
(user_000006,Russian Federation)
(user_000007,United States)

到目前为止,我已经编写了以下代码来绘制只有节点的图形: (请检查代码,因为 print g.number_of_nodes() 永远不会打印正确的节点数,尽管 print g.nodes() 显示正确的节点数。)

import csv
import networkx as nx
import matplotlib.pyplot as plt
g=nx.Graph()

#extract and add AGE_GROUP nodes in graph
f1 = csv.reader(open("user_agegroup.txt","rb"))
for row in f1: 
    g.add_nodes_from(row)
    nx.draw_circular(g,node_color='blue')

#extract and add COUNTRY nodes in graph
f2 = csv.reader(open('user_country.txt','rb'))
for row in f2:
    g.add_nodes_from(row) 
    nx.draw_circular(g,node_color='red')

#extract and add USER_ID nodes in graph
f3 = csv.reader(open('user_id.txt','rb'))
for row in f3:
    g.add_nodes_from(row)
    nx.draw_random(g,node_color='yellow')

print g.nodes()
plt.savefig("path.png")
print g.number_of_nodes()
plt.show()

除此之外,我不知道如何从 file4 和 file5 添加边。对此代码的任何帮助表示赞赏。 谢谢。

【问题讨论】:

  • g.nodes 和 g.number_of_nodes 出现的值是什么?您的预期是什么?
  • 我得到 160 作为否。节点数而不是 259,这是三个文件(文件 1、2 和 3)中的实际节点数,g.node 正在打印节点,当我计算时结果是正确的,即 259。同样,关于代码的任何建议创建边缘?
  • 那么,对于您提供的样本,您希​​望获得18个节点?
  • 至于添加边,你可以读取行然后使用 G.add_edge(row[0],row[1])
  • g.number_of_nodes 只返回g.node 的长度(内部是一个字典),g.nodes() 也只返回g.node。因此,除非您在检查 len(g.nodes())g.number_of_nodes) 之间修改图表,否则很难看出这两者将有何不同。这三个文件中的所有条目都是唯一的吗?任何重复项将对应于同一个节点。 (dict docs)

标签: python python-2.7 csv graph networkx


【解决方案1】:

为简化起见,我在 user_id.txt 和 id,country.txt 文件中设置了用户 ID [1,2,3,4,5,6,7]。您的代码中存在一些问题:

1- 首先向图形添加一些节点(例如从 user_id.txt 文件),然后绘制它,然后从另一个文件向图形添加一些其他节点,然后重新绘制整个图形同一个数字。所以,最后你在一张图中有很多图。

2- 您使用 draw_circular 方法绘制了两次,这就是为什么蓝色节点永远不会出现,因为它们被“红色”节点覆盖。

我对您的代码进行了一些更改,最终只绘制一次。为了绘制具有所需颜色的节点,我在添加节点时添加了一个名为颜色的属性。然后我使用这个属性来构建一个颜色图,并将其发送到 draw_networkx 函数。 最后,由于 id,country.txt 中的空字段,添加边有点棘手,所以我必须在创建图形之前删除空节点。这是代码和之后出现的图。

G=nx.Graph()

#extract and add AGE_GROUP nodes in graph
f1 = csv.reader(open("user_agegroup.txt","rb"))
for row in f1: 
    G.add_nodes_from(row, color = 'blue')

#extract and add COUNTRY nodes in graph
f2 = csv.reader(open('user_country.txt','rb'))
for row in f2:
    G.add_nodes_from(row, color = 'red') 

#extract and add USER_ID nodes in graph
f3 = csv.reader(open('user_id.txt','rb'))
for row in f3:
    G.add_nodes_from(row, color = 'yellow')

f4 = csv.reader(open('id,agegroup.txt','rb'))
for row in f4:
    if len(row) == 2 : # add an edge only if both values are provided
        G.add_edge(row[0],row[1])

f5 = csv.reader(open('id,country.txt','rb'))

for row in f5:
    if len(row) == 2 : # add an edge only if both values are provided
        G.add_edge(row[0],row[1])
# Remove empty nodes
for n in G.nodes():
    if n == '':
        G.remove_node(n)
# color nodes according to their color attribute
color_map = []
for n in G.nodes():
    color_map.append(G.node[n]['color'])
nx.draw_networkx(G, node_color = color_map, with_labels = True, node_size = 500)

plt.savefig("path.png")

plt.show()

【讨论】:

  • 非常感谢@Abdallah Sobehy。这很有帮助。通过修改此代码,我现在可以将从文件中读取的边添加到图中。但我认为行中有一点语法错误:color_map.append(G.node[n]['color']) 这就是为什么控制没有通过for 循环,所以那里没有图形输出。 print g.nodesprint g.edges 打印正确的节点和边列表,这意味着代码在该错误行之前是正确的。您能否确认您的代码中没有任何错误,以便我继续接受您的回答?
  • draw_networkx 也不起作用。我将其更改为draw_random,它起作用了。同样,draw_circular 也可以。
  • 编辑:nx.draw_networkx(G, node_color = color_map, with_labels = True, node_size = 500) 也不起作用。我将其更改为 nx.draw_random(g) 并且有效。同样,nx.draw_circular(g) 也可以。但它会绘制没有标签的默认红色节点......我猜node_color = color_map, with_labels = True 有问题。如果您碰巧解决了这些问题,请编辑您的答案。
  • 在发布答案之前,我运行了代码,一切正常。我现在无法验证,因为我现在没有我的机器。无论如何,只是一个小检查,我将图表命名为 G 而不是 g。检查您是否正确使用了图表名称并告诉我
  • 是的,我在我的代码中处理了 G。我想我已经解决了这个问题。我深入研究了运行代码的整个数据集,发现了几个“奇怪”的国家名称。整个事情也被弄乱了几行。我删除了它们。这解决了图表中节点未显示标签的问题。但是我仍然不知道为什么在nx.draw_networkx 中添加with_labels = true 参数时会引发错误。什么时候,我删除了这个参数并再次运行代码。令人惊讶的是,它仍然有效,标签也出现了。啊,我就这样吧。
猜你喜欢
  • 2016-10-02
  • 2018-09-15
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多