我有一个未加权的图形使用networkx
创建,我想根据边缘事件的计数/频率计算节点之间的边缘权重。我的图形中的边缘可能会出现多次,但边缘外观的频率并未事先知晓。目的是基于连接节点之间的移动的权重(例如计数/频率)来可视化边缘。本质上,我想创建一个连接节点之间移动的网络流量图,并基于颜色或边缘宽度进行可视化。例如,从节点0到1的边缘在它们之间有10个运动,并且节点1到2有5个,所以边缘0-1将使用不同的边缘颜色/尺寸来可视化。Python/NetworkX:动态计算边缘权重
我该如何计算两个节点之间的边缘权重(在将它们添加到图形中后用g.add_edges_from()
),然后重新应用到我的图形以进行可视化?以下是我最初创建图形所用的图形,数据和代码示例,以及我尝试失败的解决方案。
格拉夫
示例数据
群集的质心(节点)
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]