Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как я могу отобразить метку для узлов графа в python networkx

Автор вопроса: mribotОтветов: 2

У меня есть следующий код для визуализации графика 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 является излишним, избыточным и не должно требоваться.

  • возможный дубликат построение графика networkx с метками узлов по умолчанию для узла имя Joel 30.09.2015

pythonnetworkx

Ответы

Ответ 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: объект "список" не имеет атрибута "элементы"

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы