【发布时间】:2018-08-07 19:57:50
【问题描述】:
我想使用 Python3 的 networkx 库来表示一系列数据,但我不知道如何解决这个问题。
基本上我在两个entities 之间有一个relation,它位于一个名为nations.csv 的csv 文件中。它看起来像这样:
China, Economicaid, Egypt
China, Economicaid, Indonesia
USSR, Economicaid, Cuba
USSR, Economicaid, India
USSR, Economicaid, Poland
UK, Economicaid, India
UK, Economicaid, Jordan
USA, Economicaid, Brazil
了解第一行是与第二行之间的第三行(实体 2)相关的实体之一:
我已经解析了 csv 文件,以便将每一行存储在字典中,如下所示:
d = {}
d['entity1'] = []
d['relation'] = []
d['entity2'] = []
dictReader = csv.DictReader(open('nations.csv', 'rt'), fieldnames =
['entity1', 'relation', 'entity2'], delimiter = ',', quotechar = '"')
for row in dictReader:
for key in row:
d[key].append(row[key])
我设法做的是使用函数add_node() 绘制节点,如下例所示:
import csv
import networkx as nx
import matplotlib.pyplot as plt
d = {}
d['entity1'] = []
d['relation'] = []
d['entity2'] = []
dictReader = csv.DictReader(open('nations.csv', 'rt'), fieldnames = ['entity1', 'relation', 'entity2'], delimiter = ',', quotechar = '"')
for row in dictReader:
for key in row:
d[key].append(row[key])
print()
for i in range (1, len(d['entity1'])):
r.append(d['entity1'][i])
for k in range (1, len(d['entity2'])):
o.append(d['entity2'][k])
G=nx.Graph()
for j in range(len(r)):
G.add_node(r[j])
G.add_node(o[j])
nx.draw_networkx(G, with_labels = True, node_size = 500)
plt.show()
但是当我想表示节点之间的边时,问题就来了,因为它不仅是边本身,它还有自己的带有含义的标签。
【问题讨论】:
-
边缘的“含义”是什么?您可以将属性添加到边缘on construction 或to existing edges。一个文本标签就够了吗?
-
@Bonlenfum 边缘表示每个关系,因此它必须根据关系的类型有自己的标签。在我的
nations.csv示例中,我只放置了一种类型的关系,但它们有很多。 -
如果同一对节点之间可能存在多种类型的关系,您应该查看多重图。但是鉴于下面接受的答案,我想您的意思是不同节点对之间的关系不同,在这种情况下,边缘属性可以解决它。
标签: python python-3.x matplotlib graph networkx