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

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


person mribot    schedule 28.09.2015    source источник
comment
возможный дубликат построение графика networkx с метками узлов по умолчанию для узла имя   -  person Joel    schedule 30.09.2015


Ответы (2)


введите описание изображения здесьПроверьте исходный код 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()
person Abdallah Sobehy    schedule 28.09.2015
comment
Извините, я был недостаточно ясен. Я пробовал это, но это не сработало для меня. Если вы ссылаетесь на эту ссылку: (networkx.github.io/documentation/latest /examples/drawing/ ) Я хочу что-то, что может отображать 0,1,2,3 на нарисованном графике, а не специально назначать какую-то метку каждому узлу, который в данном случае является альфа, бета и так далее. - person mribot; 28.09.2015
comment
G = nx.erdos_renyi_graph(10,0.1); nx.draw(G, with_labels=True); plt.show(); Попробуйте это в записной книжке ipython, и вы обнаружите, что она автоматически добавляет числовые метки к узлам. - person Abdallah Sobehy; 28.09.2015
comment
Снова проверьте ответ на фигуру, которая появилась. - person Abdallah Sobehy; 28.09.2015

Ваша проблема в том, что вы отправили список узлов графа вместо необязательного аргумента, где ожидался dict. Имея этот необязательный аргумент, networkx позволяет вам отображать любую метку, которую вы хотите. В вашем случае вам нужна очевидная метка только имени узла. Это поведение по умолчанию. Так просто

networkx.draw_networkx_labels(graph,node_positions,font_size=16)

будет достаточно. Не отправляйте dict, и он будет использовать имена узлов для их маркировки.

Альтернативный вариант — сделать именно то, что предложил Абдаллах, и нарисовать весь график одной командой networkx.draw с опцией with_labels=True.


краткий комментарий к формату вашего вопроса

Когда я впервые прочитал ваш вопрос, я предположил, что команда draw_networkx_labels дает результат, отличный от того, что вы ожидали.

Теперь, когда я попробовал ваш код, я вижу, что он действительно дает ошибку. Сообщив нам, что и что ошибка

AttributeError: объект «список» не имеет атрибута «элементы»

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

person Joel    schedule 28.09.2015