Python / NetworkX: рассчитывать весы на лету

У меня есть невзвешенный граф, созданный с помощью networkx для которого я хотел бы рассчитать вес ребер между узлами на основе количества / частоты появления края. Ребро на моем графике может возникать более одного раза, но частота появления края не известна заранее. Целью является визуализация краев на основе веса (например, счет / частота) перемещений между связанными узлами. По сути, я хотел бы создать карту сетевого трафика движения между связанными узлами и визуализировать на основе цвета или ширины края. Например, край от узла 0 до 1 имеет 10 движений между ними, а узел 1 – 2 имеет 5, поэтому край 0-1 будет визуализироваться с использованием другого цвета / размера края.

Как рассчитать вес ребер между двумя узлами «на лету» (после добавления их к графику с помощью 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] 

One Solution collect form web for “Python / NetworkX: рассчитывать весы на лету”

Поскольку этот вопрос остался без ответа, был открыт второй вопрос по этой теме (здесь: Python / NetworkX: Добавить весы к краям по частоте Edge Occurance ), которые получили ответы. Чтобы добавить веса к краям на основании количества ошибок края:

 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 

Чтобы масштабировать цвет и ширину края, исходя из приведенного выше числа:

 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()

  • Чтение узлов с атрибутом pos из файла в networkx
  • Как удалить узел в сети?
  • Использование NetworkX с matplotlib.ArtistAnimation
  • NetworkX - Как представить грани, связанные с пути
  • Самый элегантный способ найти предшественников узла с помощью networkX
  • Networkx: извлечь подключенный компонент, содержащий данный узел (направленный граф)
  • Как изменить атрибуты графического графика networkx / matplotlib?
  • Networkx: перекрытие краев при визуализации MultiGraph
  • Как извлечь информацию skimage skimage в узлы и ребра NetworkX в python для дальнейшего расширенного анализа
  • Matplotlib: Как зеркалировать изображение относительно обеих осей?
  • График Plot NetworkX из матрицы смещения в CSV-файле
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.