2017-04-20 95 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 

到基於上述計數刻度顏色和邊緣寬度