我有一個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]]"
例
當邊緣是簇之間的用戶的移動,通過它們的羣集標籤來識別,例如[[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 position
和IndexError: 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)
我收到一個錯誤,'NetworkXError:節點0沒有位置。'在打印dic_pos時,字典沒有提供像上面那樣的結果。它像'{'cluster_label':{0 .....},'緯度':{0:....},'經度':{0:....}}'。我嘗試過'df.T.to_dict()',我得到了{0:{'cluster_label':0.0,'latitude':...,'longitude':....},.....'。如何按照您提供的格式將字典格式化?我試着壓縮一個列表,但也收到錯誤。 –
如果您共享原始數據文件(例如通過Dropbox鏈接),也許我或其他人能夠爲您提供一個完整的工作示例。總之,儘量使用Python函數zip。首先,df ['pos'] = list(zip(df.lat,df.long))。然後,字典(zip(df.cluster_label,df.pos)) –
'df ['pos'] = list(zip(df.longitude,df.latitude))''和'dict_pos = dict(zip(df.cluster_label ,df.pos))'訣竅!最初,我試圖壓縮緯度/經度,但試圖這樣做,同時轉化爲一個錯誤的字典。爲壓縮coords創建一個新列,然後轉換成帶有壓縮標籤和新coords的字典。謝謝! –