Выделение определенных узлов / ребер в NetworkX - проблемы с использованием zip () - PullRequest
2 голосов
/ 11 февраля 2020

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

nx.draw_networkx_edges(Gr,pos,edgelist=path_edges,edge_color='r',width=10)
  File "/usr/local/lib/python3.6/site-packages/networkx/drawing/nx_pylab.py", line 578, in draw_networkx_edges
    if not edgelist or len(edgelist) == 0:  # no edges!
TypeError: object of type 'zip' has no len()

Я ищу решение, и это потому, что скрипт выполняется поверх python3 и из-за этого я получаю эту ошибку. Одним из решений является изменение и добавление списка, как показано ниже.

оригинал:

Gr = nx.DiGraph() 
edges = graph
Gr.add_edges_from(edges)
pos = nx.spring_layout(Gr)

path = nx.shortest_path(Gr,source=1,target=7)
path_edges = zip(path,path[1:])
nx.draw_networkx_nodes(Gr,pos,nodelist=path,node_color='r')
nx.draw_networkx_edges(Gr,pos,edgelist=path_edges,edge_color='r',width=10)
plt.axis('equal')
plt.show()

Изменено:

path = nx.shortest_path(Gr,source=1,target=7)
path_edges = list(zip(path,path[1:]))
nx.draw_networkx_nodes(Gr,pos,nodelist=path,node_color='r')
nx.draw_networkx_edges(Gr,pos,edgelist=path_edges,edge_color='r',width=10)
plt.axis('equal')
plt.show()

Возможность запуска скрипта без ошибок и возможность для создания графика, но выделенный путь (красный) не выровнен по узлу и ссылке топологии. Красный путь должен быть сверху и выровнять узел / путь 1-2-3-4-5-6-7. Пожалуйста, обратитесь к изображениям ниже

image1 image3 image3

Пожалуйста, посоветуйте, как решить эту проблему проблема.

1 Ответ

1 голос
/ 13 февраля 2020

Мне удалось сгенерировать график, который вам нужен, с помощью следующего кода - сообщите мне, если у вас возникнут какие-либо проблемы. Вы были правы, что вам нужно преобразовать объект zip в list, но я думаю, что в вашем коде чертежа могут быть другие ошибки. Если вам нужно, чтобы выходные данные nx.spring_layout были одинаковыми каждый раз, вы можете использовать аргумент ключевого слова seed, например pos = nx.spring_layout(Gr, seed=123).

Код:

import networkx as nx

# Set up graph
Gr = nx.DiGraph() 
edges = [(i+1, i+2) for i in range(10)] + [(i+2, i+1) for i in range(10)]
Gr.add_edges_from(edges)

# Get position using spring layout
pos = nx.spring_layout(Gr)

# Get shortest path
path = nx.shortest_path(Gr,source=1,target=7)
path_edges = list(zip(path,path[1:]))

# Draw nodes and edges not included in path
nx.draw_networkx_nodes(Gr, pos, nodelist=set(Gr.nodes)-set(path))
nx.draw_networkx_edges(Gr, pos, edgelist=set(Gr.edges)-set(path_edges), connectionstyle='arc3, rad = 0.3')

# Draw nodes and edges included in path
nx.draw_networkx_nodes(Gr, pos, nodelist=path, node_color='r')
nx.draw_networkx_edges(Gr,pos,edgelist=path_edges,edge_color='r', connectionstyle='arc3, rad = 0.3')

# Draw labels
nx.draw_networkx_labels(Gr,pos)

Выход:

enter image description here

...