У меня есть следующий код для визуализации графика networkx:
node_positions = networkx.spring_layout(graph)
networkx.draw_networkx_nodes(graph, node_positions)
networkx.draw_networkx_edges(graph, node_positions, style='dashed')
Я хочу отображать метку узла на каждом узле. graph.nodes() даст мне список всех узлов, но как я могу использовать их для обозначения узлов на графике?
Я пробовал это, но это не работает:
networkx.draw_networkx_labels(graph,node_positions,graph.nodes(data="false"),font_size=16)
РЕДАКТИРОВАТЬ:
Я попробовал следующее и сейчас работает:
for node,_ in graph.nodes(data="False"):
labels[node] = node;
networkx.draw_networkx_labels(graph,node_positions,labels,font_size=16)
Если есть еще какой-нибудь элегантный способ сделать это, пожалуйста, дайте мне знать. Я чувствую, что создание нового dict является излишним, избыточным и не должно требоваться.
Ответ 1 · рейтинг 1 · Abdallah Sobehy
Проверьте исходный код nx.draw или чертежная документация. Я не совсем уверен, что правильно понял ваш вопрос, потому что, насколько я понимаю, это довольно простая проблема, просто вам разрешено добавлять метки для графика следующим образом:
networkx.draw(graph, node_positions, with_labels = True)
Вы также можете использовать draw_spring напрямую, без необходимости явно назначать позиции узлов:
networkx.draw_spring(graph, with_labels = True)
На рисунке показан результат выполнения следующего кода:
import networkx as nx
G = nx.erdos_renyi_graph(10,0.4)
nx.draw(G, with_labels=True)
plt.show()
Ответ 2 · Joel
Ваша проблема в том, что вы отправили список узлов графа вместо необязательного аргумента, где ожидался dict. Имея этот необязательный аргумент, networkx позволяет вам отображать любую метку, которую вы хотите. В вашем случае вам нужна очевидная метка только имени узла. Это поведение по умолчанию. Так просто
networkx.draw_networkx_labels(graph,node_positions,font_size=16)
будет достаточно. Не отправляйте dict, и он будет использовать имена узлов для их маркировки.
Альтернативный вариант - сделать именно то, что предложил Абдаллах, и нарисовать весь график одной командой networkx.draw с опцией with_labels=True.
краткий комментарий к формату вашего вопроса
Когда я впервые прочитал ваш вопрос, я предположил, что команда draw_networkx_labels дает результат, отличный от того, что вы ожидали.
Теперь, когда я попробовал ваш код, я вижу, что он действительно дает ошибку. Сообщив нам, что и что ошибка
AttributeError: объект "список" не имеет атрибута "элементы"
было бы намного проще выяснить, что не так, поэтому для дальнейшего использования, если вы получите сообщение об ошибке, оно содержит информацию о том, в чем проблема. Если вы публикуете вопрос, опубликуйте также сообщение об ошибке.