在Networkx中绘制节点值(Python)?

2 投票
3 回答
1104 浏览
提问于 2025-04-18 00:53

我正在导入一个叫做 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})]

撰写回答