在Networkx(Python)中打印节点值?

在Networkx(Python)中打印节点值?,python,csv,graphics,networkx,Python,Csv,Graphics,Networkx,我正在导入一个名为network\u nodes的csv文件,它看起来像 ['151753', '111598', '0.211413517594337', '-0.130335792899132'] ['151753', '118516', '0.211413517594337', '-0.100253812968731'] 其中前两列表示节点,最后两列是与这些节点关联的值 例如,这里名为'151753'的节点连接到名为'111598'和'118516'的节点。节点'151753'与值为'0

我正在导入一个名为
network\u nodes
的csv文件,它看起来像

['151753', '111598', '0.211413517594337', '-0.130335792899132']
['151753', '118516', '0.211413517594337', '-0.100253812968731']
其中前两列表示
节点
,最后两列是与这些节点关联的

例如,这里名为
'151753'
的节点连接到名为
'111598'
'118516'
的节点。节点
'151753'
为'0.211413517594337',而
'111598'
为-0.130335792899132'相关联

我想在Networkx中绘制此网络,根据节点值使用不同的颜色(或节点大小)(例如,值非常高时为红色/大,值非常低时为蓝色/小)

我不知道怎么做。我知道我应该用像

G=nx.read_adjlist('network_nodes.csv', delimiter=',')
nx.draw(G)

但是read_adjlist函数不允许我导入节点值

您需要编写一些自定义内容来读取文件。 这里有一个方法:

node,weight,color
1,7.0,r
2,42,g
3,1,b
--

和绘图

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()

您需要编写一些自定义代码,这是正确的,但是由于您有一个边列表,而不是节点列表,因此下面的代码将更好地工作

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})]

您引用的行不是csv文件格式。假设您更喜欢使用int和float而不是字符串,这将是正确的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加载程序加载图形数据应该会成功。

当我尝试您的代码时,我得到一个错误
2个节点=G.nodes()
3个颜色=[G.node[n]['value']表示节点中的n个]
--->4个大小=[float(G.node[n]['value'])*100表示节点中的n个]
ValueError:无法将字符串转换为浮点:
使用
nodes=G.nodes()
color=[G.node[n]['value']表示节点中的n个]
大小=[float(G.node[n]['value'])*100表示节点中的n个]您是否知道上文建议的
。你有什么建议吗?谢谢也许我应该修改您的代码,以便将值存储为浮点数?你知道怎么做吗?我基本上是在尝试绘制网络,其中节点的大小与值成比例(例如),如果值为正,则节点颜色为绿色,如果值为负,则节点颜色为红色。如果您有时间帮助我,请提前谢谢!!!Noobie,没错,你会想转换成一个float。我将更改代码以执行此操作。
sed -i.bak "s/\[\(.*\)\]$/\1/" network_nodes
sed -i.bak "s/'\([0-9\.-]*\)'/\1/g" network_nodes