Создать взвешенный график NetworkX на основе расположения вершин - PullRequest
0 голосов
/ 16 октября 2018

У меня есть информация о ребре, организованная таким образом, чтобы показать местоположение ребра в Графике обычного типа;где регулярный граф определяется как график, похожий на «шахматную доску».Вот пример того, как организованы данные:

(7, 3) (6, 3) 1.0
(7, 3) (8, 3) 1.0
(7, 3) (8, 2) 1.41421356237
(7, 3) (6, 4) 1.41421356237
(7, 3) (7, 4) 1.0
(7, 3) (6, 2) 1.41421356237
(7, 3) (7, 2) 1.0
(7, 3) (8, 4) 1.41421356237

Здесь столбец 1 представляет местоположение первой точки (например, 7 столбцов сверху и 3 строки вниз для самой первой точки), столбец 2 представляет соседнюю точкуточка, а столбец 3 представляет значение веса ребра между двумя точками.Приведенный пример показывает все возможные соседние пути (включая диагонали) для точки в местоположении (7,3).

Мой код для создания графика с этими ребрами выглядит так:

import networkx as nx
edgelist = r'C:\filepath'
edges = nx.read_weighted_edgelist(edgelist, create_using= nx.Graph(), nodetype= int)
nx.draw_networkx(edges)

Я не получаю сообщение об ошибке, но я получаю только пустой вывод.Есть мысли о том, как это исправить?Я использую Python 27. Спасибо!

1 Ответ

0 голосов
/ 16 октября 2018

Идентичность узла в принципе не зависит от его положения.Вы можете упростить задачу, создав фиктивную идентификацию для каждого узла и сохранив положение узла в другой структуре данных, которую вы затем используете при рисовании графика.Например, вы можете сделать следующее:

import numpy as np
import matplotlib.pyplot as plt
import re
import networkx as nx

def load(fpath):
    # adapated from: https://stackoverflow.com/a/48097465/2912349
    data = []
    pattern='\((\d+, \d+)\)'
    with open(fpath, 'r') as f:
        for line in f:
            matches = re.findall(pattern, line)
            source, target = [tuple(map(lambda x:int(x),item.split(','))) for item in matches]
            weight = float(line.split(' ')[-1])
            data.append((source, target, weight))
    return data

data = load('test_grid.txt')
# print data

# determine unique nodes
sources = [source for source, _, _ in data]
targets = [target for _, target, _ in data]
coordinates = set(sources + targets)

# create mappings from node -> coordinate and vice versa
pos     = {ii : xy for ii, xy in enumerate(coordinates)}
inverse = {xy : ii for ii, xy in enumerate(coordinates)}

# create a more conventional edge list
edges = []
for (source_coord, target_coord, weight) in data:
    edge = (inverse[source_coord], inverse[target_coord], weight)
    edges.append(edge)

# create graph and plot
g = nx.Graph()
g.add_weighted_edges_from(edges)
nx.draw(g, pos)

enter image description here

Этот сценарий предполагает, что ваш график хранится в текстовом файле на test_grid.txt.Измените путь по мере необходимости.

...