首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python/NetworkX:动态计算边缘权重

Python/NetworkX:动态计算边缘权重
EN

Stack Overflow用户
提问于 2017-04-20 20:58:57
回答 1查看 5.1K关注 0票数 2

我有一个未加权图,它是用networkx创建的,为此,我希望根据边缘出现的计数/频率来计算节点之间的边的权重。我的图形中的边缘可以发生多次,但边缘出现的频率是事先不知道的。其目的是根据连接节点之间移动的权重(例如计数/频率)来可视化边缘。本质上,我想创建一个网络流量图,在连接的节点之间移动,并基于颜色或边缘宽度可视化。例如,从节点0到1的边缘在它们之间有10个移动,而节点1到2有5个,因此边缘0-1将使用不同的边缘颜色/大小来可视化。

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

样本数据

簇质心(节点)

代码语言:javascript
复制
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

轨迹(边)

代码语言:javascript
复制
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]]"

代码语言:javascript
复制
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作为属性,但没有取得任何成功。我还试着用这个也没用的方法:

代码语言:javascript
复制
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]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-01 14:20:08

由于这个问题没有得到回答,关于这个话题的第二个问题(这里是:Python/NetworkX: Add Weights to Edges by Frequency of Edge Occurance)开始了,并收到了答复。若要根据边缘出现次数的计数向边缘添加权重:

代码语言:javascript
复制
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

若要根据上述计数缩放颜色和边缘宽度:

代码语言:javascript
复制
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()中传递

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43529800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档