问题描述
我有一个从以下边缘创建的networkx图:
I have a networkx graph created from edges such as these:
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
的移动.这些簇具有以纬度和经度形式存储在另一个文件中的坐标,例如:
Where the edges are a user's movements between clusters, identified by their cluster label, e.g., [[340, 269], [269, 340]]
. This represents a user's movement from cluster 340
to cluster 269
and then back to cluster 340
. These clusters have coordinates, stored in another file, in the form of latitude and longitude, such as these:
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.
Is it possible to link the edges of my graph to their respective cluster in physical space using the node/cluster's lat/long and not in the abstract space of a graph? If so, how might I go about doing so? I would like to graph this on a map using a package such as mplleaflet
(like shown here: http://htmlpreview.github.io/?https://github.com/jwass/mplleaflet/master/examples/readme_example.html) or directly into QGIS/ArcMap.
编辑
我正在尝试将具有簇质心坐标的csv转换为字典,但是,遇到了一些错误.主要是NetwotkXError: Node 0 has no position
和IndexError: too many indices for array.
下面是我尝试转换为字典,然后使用mplleaflet
绘制图形的方式.
I'm attempting to convert my csv with cluster centroid coordinates into a dictionary, however, I've run into several errors. Mainly, NetwotkXError: Node 0 has no position
and IndexError: too many indices for array.
Below is how I'm trying to convert to a dict and then graph with 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()创建字典.例如:
yes it is quite easily possible. Try something along this lines.Create a dictionary, where the node (cluster_label) is the key and longitude latitude are saved as values in a list. I would use pd.read_csv() to read the csv and then use the df.to_dict() to create the dictionary. It should look like this for example:
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],
.....
然后在地图上绘制图形就像这样简单:
Then plotting the graph on a map is as easy as:
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)
如果未产生预期结果,请尝试反转纬度和经度.
If it does not produce the expected result try to reverse latitude,longitude.
这篇关于Python:使用NetworkX和mplleaflet的图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!