2016-11-28 107 views
0

我有CSV文件在下面的格式,不能散點圖使用Networkx在Python

A,B,23 
C,D,21 
D,B,12 

,其中每個節點代表一個站和權重表示它們之間的運行時間。 我需要使用networkx來創建一個圖形,將節點作爲工作站並將運行時間作爲它們之間的邊緣。 我創建了一個多層次的字典如下格式

{'A': {'B': '29'}, 'C': {'D': '26'},'C': {'B': '12'} 

我已經無法創建圖形和使用Networkx繪製。

創建圖表後我也將申請Dijstra算法找到最短路徑

我共有1500行我的CSV文件從我轉換成字典。有沒有其他有效的方法來做到這一點?

+1

你可以縮小這個單一的問題,並解釋你所嘗試的? – Joel

+0

你是如何嘗試創建圖表的,出了什麼問題?請提供[mcve]。 –

+0

這是我的用於通過CSV文件讀取,使多級詞典 my_dict = {} 張開( 'final_graph.csv')作爲f_input代碼:在csv.reader 爲行(f_input): my_dict [行[0]] = {row [1]:row [2]} 我想將my_dict轉換爲具有所有節點和邊的可見網絡圖 –

回答

0

因爲密鑰不是唯一的(您有兩次作爲密鑰),所以不能將數據存儲在類似{'A': {'B': '29'}, 'C': {'D': '26'}, 'C': {'B': '12'}}的字典中。我建議使用2D列表來代替,例如, 'A': {'B': '29'}將變爲['A', 'B', '29']

我假設你的圖是無向的(邊A-> B與B-> A相同),並且兩個節點之間沒有更多的邊。

這裏是我的例子,只有3個邊,我繪製節點(和他們的名字)和邊緣(和他們的權重)。我還將你的權重轉換爲數值,因爲你聲明你將在你的圖上進行計算。

import networkx as nx 
import matplotlib.pyplot as plt 

data = [ 
    ['A', 'B', '29'], 
    ['C', 'D', '26'], 
    ['C', 'B', '12'] 
] 

G = nx.Graph() # new empty undirected graph 

for row in data: 
    src_node = row[0] 
    dest_node = row[1] 
    weight = float(row[2]) # convert weight to a number 
    G.add_edge(src_node, dest_node, weight=weight) 

pos = nx.spring_layout(G) # compute graph layout 
nx.draw(G, pos, node_size=700) # draw nodes and edges 
nx.draw_networkx_labels(G, pos) # draw node labels/names 
# draw edge weights 
labels = nx.get_edge_attributes(G, 'weight') 
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels) 
# show image 
plt.show(G) 

輸出: enter image description here

注意,這可能需要一段時間Python來繪製圖形,如果你有很多節點和邊緣(圖像也可能是雜亂)的。值得一提的是,使用spring_layout佈局功能,您可以在每次運行代碼時獲得不同的圖像。