【问题标题】:Python: Graph using NetworkX and mplleafletPython:使用 NetworkX 和 mplleaflet 绘制图形
【发布时间】:2017-04-16 02:35:55
【问题描述】:

我有一个从边缘创建的 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 之类的包(如此处所示: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)

【问题讨论】:

    标签: python graph leaflet networkx


    【解决方案1】:

    是的,这很容易实现。沿着这条线尝试一些东西。 创建一个字典,其中节点(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) 
    

    如果没有产生预期的结果,请尝试反转纬度,经度。

    【讨论】:

    • 我收到一个错误,NetworkXError: Node 0 has no position. 打印 dic_pos 时,字典没有提供上述结果。它看起来像{'cluster_label': {0.....}, 'latitude': {0: ....}, 'longitude': {0: ....}}。我试过df.T.to_dict(),我得到了{0: {'cluster_label': 0.0, 'latitude': ..., 'longitude': ....}, .....。如何格式化字典以按照您提供的方式阅读?我尝试压缩列表,但也收到错误。
    • 如果您共享原始数据文件(例如通过保管箱链接),也许我或其他人能够为您提供一个完整的工作示例。无论如何,尝试熟悉 Python 函数 zip。首先,df['pos'] = list(zip(df.lat, df.long))。然后, dict(zip(df.cluster_label,df.pos))
    • df['pos'] = list(zip(df.longitude,df.latitude))dict_pos = dict(zip(df.cluster_label,df.pos)) 成功了!最初,我曾尝试压缩纬度/经度,但在转换为给出错误的字典时试图这样做。为压缩坐标创建一个新列,然后转换为带有标签和压缩新坐标的字典。谢谢!
    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2013-10-13
    • 2017-07-06
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多