在Networkx中绘制节点值(Python)?
我正在导入一个叫做 network_nodes
的csv文件,内容大概是这样的:
['151753', '111598', '0.211413517594337', '-0.130335792899132']
['151753', '118516', '0.211413517594337', '-0.100253812968731']
这个文件的前两列表示 nodes
(节点),后两列是与这些节点相关的 values
(值)。
举个例子,这里有一个叫 '151753'
的节点,它连接了两个节点,分别是 '111598'
和 '118516'
。同时,节点 '151753'
的值是 '0.211413517594337',而 '111598'
的值是 -0.130335792899132'。
我想在 Networkx 中绘制这个网络,并根据节点的值使用不同的颜色(或者节点大小),比如当值很高时用红色和大号,当值很低时用蓝色和小号。
不过我不知道该怎么做。我知道应该使用类似于
G=nx.read_adjlist('network_nodes.csv', delimiter=',')
nx.draw(G)
的东西,但 read_adjlist 函数不让我导入节点值……
3 个回答
1
你引用的那些行并不是csv文件格式。如果你想要用整数和浮点数而不是字符串,这里是正确的csv格式的数据:
151753,111598,0.211413517594337,-0.130335792899132
151753,118516,0.211413517594337,-0.100253812968731
你可以选择把数据当作列表加载,而不是使用csvreader,或者你可以用下面的sed命令来转换你的文件:
sed -i.bak "s/\[\(.*\)\]$/\1/" network_nodes
sed -i.bak "s/'\([0-9\.-]*\)'/\1/g" network_nodes
.bak
文件是临时的备份文件,可以用来撤销之前的sed命令。完成后记得把它们删除。这样做之后,使用csv加载器加载图形数据应该就能成功了。
4
你需要写一些自定义的代码来读取你的文件。
这里有一种方法:
node,weight,color
1,7.0,r
2,42,g
3,1,b
--
import csv
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
with open('nodelist.txt') as f:
reader = csv.DictReader(f)
for row in reader:
node = int(row.pop('node'))
G.add_node(node, **row)
print G.nodes(data=True)
# [(1, {'color': 'r', 'weight': '7.0'}), (2, {'color': 'g', 'weight': '42'}), (3, {'color': 'b', 'weight': '1'})]
还有绘图的部分
nodes = G.nodes()
color = [G.node[n]['color'] for n in nodes]
size = [float(G.node[n]['weight'])*100 for n in nodes]
nx.draw(G, nodes=nodes,node_color=color, node_size=size)
plt.show()
3
Aric说得对,你确实需要写一些自定义代码。不过,因为你手里有的是边的列表,而不是节点的列表,所以下面的代码会更适合你。
import csv
import networkx as nx
G = nx.DiGraph()
with open('network_nodes.csv') as f:
node_list = csv.reader(f)
for row in node_list:
G.add_edge(row[0],row[1])
G.node[row[0]]['value'] = float(row[2])
G.node[row[1]]['value'] = float(row[3])
G.nodes(data=True) #print out
这段代码会输出以下内容:
[('151753', {'value': 0.211413517594337}),
('118516', {'value': -0.100253812968731}),
('111598', {'value': -0.130335792899132})]