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

时间:2014-04-01 15:58:09

标签: python csv graphics networkx

我正在导入名为network_nodes的csv文件,该文件看起来像

['151753', '111598', '0.211413517594337', '-0.130335792899132']
['151753', '118516', '0.211413517594337', '-0.100253812968731']

其中前两列表示nodes,最后两列是与这些节点关联的values

例如,此处名为'151753'的节点连接到名为'111598''118516'的节点。节点'151753'value的{​​{1}}相关联,而'111598'value的-0.130335792899132相关联。

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

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

这样的东西
G=nx.read_adjlist('network_nodes.csv', delimiter=',')
nx.draw(G)

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

3 个答案:

答案 0 :(得分: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()

enter image description here

答案 1 :(得分: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})]

答案 2 :(得分: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加载器加载图形数据应该在执行此操作后成功。