2016-11-28 3 views
0

У меня есть CSV файл в формате ниже,не в состоянии Постройте график Использование NetworkX в Python

A,B,23 
C,D,21 
D,B,12 

, где каждый узел представляет собой станцию ​​и вес представляет время работы между ними. Мне нужно построить график, используя networkx, имеющий узел как станцию ​​и время выполнения в качестве края между ними. Я создал многоуровневый словарь ниже формата

{'A': {'B': '29'}, 'C': {'D': '26'},'C': {'B': '12'} 

Я не был в состоянии создать график и сделать его с помощью NetworkX.

После создания графика я также буду применять алгоритм Dijstra, чтобы найти кратчайший путь

У меня есть всего 1500 строк в моем файле CSV, из которого я преобразования в словарь. Есть ли другой эффективный способ сделать это?

+1

Можете ли вы сузить это до одного вопроса и объяснить, что вы пробовали? – Joel

+0

Как вы пытались создать график, и что пошло не так? Пожалуйста, предоставьте [mcve]. –

+0

Вот мой код для чтения через CSV файл и сделать многоуровневый словарь my_dict = {} с открытым ('') final_graph.csv как f_input: для строки в csv.reader (f_input): my_dict [строка [0]] = {строка [1]: строка [2]} Я хочу преобразовать my_dict в видимый сетевой график со всеми узлами и ребрами –

ответ

0

Вы не можете использовать свои данные в словаре, например {'A': {'B': '29'}, 'C': {'D': '26'}, 'C': {'B': '12'}}, потому что ключи не уникальны (у вас есть C два раза в качестве ключа). Вместо этого я предлагаю использовать 2D-список, где, например, 'A': {'B': '29'} будет ['A', 'B', '29'].

Я предполагаю, что ваш график неориентирован (край A-> B такой же, как B-> A), и что у вас не больше одного края между двумя узлами.

Вот мой пример с тремя ребрами, где я рисую узлы (и их имена) и ребра (и их веса). Я также преобразовал ваши веса в числовые значения, так как вы заявили, что будете выполнять вычисления на своем графике.

import networkx as nx 
import matplotlib.pyplot as plt 

data = [ 
    ['A', 'B', '29'], 
    ['C', 'D', '26'], 
    ['C', 'B', '12'] 
] 

G = nx.Graph() # new empty undirected graph 

for row in data: 
    src_node = row[0] 
    dest_node = row[1] 
    weight = float(row[2]) # convert weight to a number 
    G.add_edge(src_node, dest_node, weight=weight) 

pos = nx.spring_layout(G) # compute graph layout 
nx.draw(G, pos, node_size=700) # draw nodes and edges 
nx.draw_networkx_labels(G, pos) # draw node labels/names 
# draw edge weights 
labels = nx.get_edge_attributes(G, 'weight') 
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels) 
# show image 
plt.show(G) 

Выход: enter image description here

Обратите внимание, что это может занять некоторое время для Python, чтобы нарисовать график, если у вас есть много узлов и ребер (изображение может быть загроможден). Стоит отметить, что с помощью функции макета spring_layout вы можете получать разные изображения при каждом запуске кода.

Смежные вопросы