2014-04-01 69 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

謝謝你的建議! –