2017-04-16 54 views
1

我有一個networkx圖表從邊緣創建的諸如這些:的Python:格拉夫使用NetworkX和mplleaflet

user_id,edges 
11011,"[[340, 269], [269, 340]]" 
80973,"[[398, 279]]" 
608473,"[[69, 28]]" 
2139671,"[[382, 27], [27, 285]]" 
3945641,"[[120, 422], [422, 217], [217, 340], [340, 340]]" 
5820642,"[[458, 442]]" 

enter image description here

當邊緣是簇之間的用戶的移動,通過它們的羣集標籤來識別,例如[[340, 269], [269, 340]]。這表示用戶從cluster 340移動到cluster 269,然後返回到cluster 340。這些集羣具有座標,存儲在另一個文件中,在緯度和經度的形式,如這些:

cluster_label,latitude,longitude 
0,39.18193382,-77.51885109 
1,39.18,-77.27 
2,39.17917928,-76.6688633 
3,39.1782,-77.2617 
4,39.1765,-77.1927 

是否有可能在物理空間使用節點我的圖的邊鏈接到它們各自的集羣/集羣的緯度/長度,而不是在圖形的抽象空間?如果是這樣,我該怎麼做呢?我想在地圖上使用諸如mplleaflet(如圖所示:http://htmlpreview.github.io/?https://github.com/jwass/mplleaflet/master/examples/readme_example.html)或直接在QGIS/ArcMap中打包。

編輯

我試圖我的CSV轉換與聚類中心座標轉換爲一個字典,但是,我碰到的幾個錯誤。主要是,NetwotkXError: Node 0 has no positionIndexError: too many indices for array.下面是我想如何轉換爲字典,然後與mplleaflet圖形。

import csv 
import networkx as nx 
import pandas as pd 
import matplotlib.pyplot as plt 
import time 
import mplleaflet 


g = nx.Graph() 

# Set node positions as a dictionary 
df = pd.read_csv('G:\Programming Projects\GGS 681\dmv_tweets_20170309_20170314_cluster_centroids.csv', delimiter=',') 
df.set_index('cluster_label', inplace=True) 
dict_pos = df.to_dict(orient='index') 
#print dict_pos 

for row in csv.reader(open('G:\Programming Projects\GGS 681\dmv_tweets_20170309_20170314_edges.csv', 'r')): 
    if '[' in row[1]:  # 
     g.add_edges_from(eval(row[1])) 

# Plotting with matplotlib 
#nx.draw(g, with_labels=True, alpha=0.15, arrows=True, linewidths=0.01, edge_color='r', node_size=250, node_color='k') 
#plt.show() 

# Plotting with mplleaflet 
fig, ax = plt.subplots() 

nx.draw_networkx_nodes(g,pos=dict_pos,node_size=10) 
nx.draw_networkx_edges(g,pos=dict_pos,edge_color='gray', alpha=.1) 
nx.draw_networkx_labels(g,dict_pos, label_pos =10.3) 
mplleaflet.display(fig=ax.figure) 

回答

2

是的,這很容易。嘗試沿着這條線。 創建一個字典,其中節點(cluster_label)是鍵和經度緯度被保存爲列表中的值。我將使用pd.read_csv()來讀取csv,然後使用df.to_dict()創建字典。它應該是這樣的,例如:

dic_pos = {u'0': [-77.51885109, 39.18193382], 
u'1': [-76.6688633, 39.18], 
u'2': [-77.2617, 39.1791792], 
u'3': [-77.1927, 39.1782], 
..... 

然後繪製在地圖上圖是一樣容易:

import mplleaflet 

fig, ax = plt.subplots() 

nx.draw_networkx_nodes(GG,pos=dic_pos,node_size=10,node_color='red',edge_color='k',alpha=.5, with_labels=True) 
nx.draw_networkx_edges(GG,pos=dic_pos,edge_color='gray', alpha=.1) 
nx.draw_networkx_labels(GG,pos=dic_pos, label_pos =10.3) 

mplleaflet.display(fig=ax.figure) 

如果沒有產生預期的結果,嘗試扭轉緯度,經度。

+0

我收到一個錯誤,'NetworkXError:節點0沒有位置。'在打印dic_pos時,字典沒有提供像上面那樣的結果。它像'{'cluster_label':{0 .....},'緯度':{0:....},'經度':{0:....}}'。我嘗試過'df.T.to_dict()',我得到了{0:{'cluster_label':0.0,'latitude':...,'longitude':....},.....'。如何按照您提供的格式將字典格式化?我試着壓縮一個列表,但也收到錯誤。 –

+0

如果您共享原始數據文件(例如通過Dropbox鏈接),也許我或其他人能夠爲您提供一個完整的工作示例。總之,儘量使用Python函數zip。首先,df ['pos'] = list(zip(df.lat,df.long))。然後,字典(zip(df.cluster_label,df.pos)) –

+0

'df ['pos'] = list(zip(df.longitude,df.latitude))''和'dict_pos = dict(zip(df.cluster_label ,df.pos))'訣竅!最初,我試圖壓縮緯度/經度,但試圖這樣做,同時轉化爲一個錯誤的字典。爲壓縮coords創建一個新列,然後轉換成帶有壓縮標籤和新coords的字典。謝謝! –