2017-04-20 434 views
0

我有一个未加权的图形使用networkx创建,我想根据边缘事件的计数/频率计算节点之间的边缘权重。我的图形中的边缘可能会出现多次,但边缘外观的频率并未事先知晓。目的是基于连接节点之间的移动的权重(例如计数/频率)来可视化边缘。本质上,我想创建一个连接节点之间移动的网络流量图,并基于颜色或边缘宽度进行可视化。例如,从节点0到1的边缘在它们之间有10个运动,并且节点1到2有5个,所以边缘0-1将使用不同的边缘颜色/尺寸来可视化。Python/NetworkX:动态计算边缘权重

我该如何计算两个节点之间的边缘权重(在将它们添加到图形中后用g.add_edges_from()),然后重新应用到我的图形以进行可视化?以下是我最初创建图形所用的图形,数据和代码示例,以及我尝试失败的解决方案。

格拉夫

enter image description here

示例数据

群集的质心(节点)

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 
5,39.1762375,-76.8675441 
6,39.17468,-76.8204499 
7,39.17457332,-77.2807235 
8,39.17406072,-77.274685 
9,39.1731621,-77.2716502 
10,39.17,-77.27 

轨迹(边缘)

user_id,trajectory 
11011.0,"[[340, 269], [269, 340]]" 
80973.0,"[[398, 279]]" 
608473.0,"[[69, 28]]" 
2139671.0,"[[382, 27], [27, 285]]" 
3945641.0,"[[120, 422], [422, 217], [217, 340], [340, 340]]" 
5820642.0,"[[458, 442]]" 
6060732.0,"[[291, 431]]" 
6912362.0,"[[68, 27]]" 
7362602.0,"[[112, 269]]" 
8488782.0,"[[133, 340], [340, 340]]" 

代码

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

g = nx.MultiGraph() 

df = pd.read_csv('cluster_centroids.csv', delimiter=',') 
df['pos'] = list(zip(df.longitude,df.latitude)) 
dict_pos = dict(zip(df.cluster_label,df.pos)) 
#print dict_pos 

for row in csv.reader(open('edges.csv', 'r')): 
    if '[' in row[1]:  # 
     g.add_edges_from(eval(row[1])) 

# Plotting with mplleaflet 
fig, ax = plt.subplots() 
nx.draw_networkx_nodes(g,pos=dict_pos,node_size=50,node_color='b') 
nx.draw_networkx_edges(g,pos=dict_pos,linewidths=0.01,edge_color='k', alpha=.05) 
nx.draw_networkx_labels(g,dict_pos) 
mplleaflet.show(fig=ax.figure) 

我一直在使用g.add_weighted_edges_from()并添加weight=1作为一个属性试过了,但还没有任何运气。我用这个也没有工作也试过:

for u,v,d in g.edges(): 
    d['weight'] = 1 
g.edges(data=True) 
edges = g.edges() 
weights = [g[u][v]['weight'] for u,v in edges] 

回答

0

由于这个无人接听,有关这个主题的第2个问题打开(在这里:Python/NetworkX: Add Weights to Edges by Frequency of Edge Occurance),它收到的答复。到的权重基于边缘出现的计数添加到边缘:

minLineWidth = 0.25 

for u, v, d in g.edges(data=True): 
    d['weight'] = c[u, v]*minLineWidth 
edges,weights = zip(*nx.get_edge_attributes(g,'weight').items()) 

values = range(len(g.edges()) 
jet = cm = plt.get_cmap('YlOrRd') 
cNorm = colors.Normalize(vmin=0, vmax=values[-1]) 
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet) 
colorList = [] 

for i in range(len(g.edges()): 
    colorVal = scalarMap.to_rgba(values[i]) 
    colorList.append(colorVal) 

和传球width=[d['weight'] for u,v, d in g.edges(data=True)]edge_color=colorList作为参数在nx.draw_networkx_edges()

g = nx.MultiDiGraph() 

df = pd.read_csv('G:\cluster_centroids.csv', delimiter=',') 
df['pos'] = list(zip(df.longitude,df.latitude)) 
dict_pos = dict(zip(df.cluster_label,df.pos)) 
#print dict_pos 


for row in csv.reader(open('G:\edges.csv', 'r')): 
    if '[' in row[1]:  # 
     g.add_edges_from(eval(row[1])) 

for u, v, d in g.edges(data=True): 
    d['weight'] = 1 
for u,v,d in g.edges(data=True): 
    print u,v,d 

到基于上述计数刻度颜色和边缘宽度