繁体   English   中英

Python:使用NetworkX和mplleaflet的图

[英]Python: Graph using NetworkX and mplleaflet

我有一个从以下边缘创建的networkx图:

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 340cluster 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类的mplleaflet (如此处所示: http : mplleaflet : mplleaflet )或直接导入QGIS / ArcMap中。

编辑

我正在尝试将具有群集质心坐标的csv转换为字典,但是,遇到了一些错误。 主要是NetwotkXError: Node 0 has no positionIndexError: too many indices for array. 下面是我尝试转换为字典,然后使用mplleaflet绘制图形的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)

是的,这很容易做到。 尝试一些类似的方法。 创建一个字典,其中节点(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) 

如果未产生预期结果,请尝试反转纬度和经度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM