2014-04-01 70 views
2

我叫导入一个network_nodes csv文件,它看起来像在Networkx(Python)中绘制节点值?

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

其中前两个列表示nodes和2个最后一列是与这些节点关联values

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

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

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

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

但read_adjlist功能不允许我导入节点值...

回答

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

太棒了!感谢您定制一些代码! –

+0

当我尝试你的代码我得到一个错误 '2个节点= G.nodes()' '3颜色= [G.node [n] ['值']为节点]' '---- > 4 size = [float(G。节点[N] [ '值'])* 100在节点N]' 'ValueError异常:无法将字符串转换为float:' 使用 '节点= G.nodes()'' 后颜色= [ G.node [n] ['value'] for n in nodes]' 'size = [float(G.node [n] ['value'])* 100 for n in nodes]您是否知道' as如上所述。你有什么建议吗?谢谢!! –

+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

+0

非常感谢你! –

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加载器加载图形数据应该会成功。

+0

谢谢你的建议! –