Установка местоположения узла с помощью словаря - PullRequest
1 голос
/ 01 апреля 2020

У меня есть словарь со следующими данными:

pos = {0: (1,1), 1: (2,2), 2: (3,2), 3: (4,3)}

Затем я попробовал следующий код:

import networkx as nx
G = nx.Graph()
G.add_nodes_from(pos)
#also G.add_nodes_from(pos.keys())
print(G.nodes(True))

, который дает:

>>>> [(0, {}), (1, {}), (2, {}), (3, {})]

как видите, позиции пусты.

Но если я напишу

G = nx.random_geometric_graph(5, 0.50)
print(G.nodes(True))

, он возвращает

[(0, {'pos': [0.895101164279736, 0.43929155577155976]}), (1, {'pos': [0.006064168598946429, 0.6044775286563574]}), (2, {'pos': [0.021659978032451344, 0.47877598747213523]}), (3, {'pos': [0.05130150282000934, 0.1137451989310001]}), (4, {'pos': [0.8734509206210705, 0.9839817045923323]})]

, это график с местоположениями. Также я попытался изменить «pos» на «pos2»:

pos2 = {0:{'pos': [1,1]}, 1: {'pos':[2,2]}, 2: {'pos':[3,2]}, 3: {'pos':[4,3]}}

, и я также попробовал коды из других связанных вопросов:

1) answer1

for n, p in pos.iteritems():
    X.node[n]['pos'] = p

2) answer2

pos={'0':(1,0),'1':(1,1),'2':(2,3),'3':(3,2),'4':(0.76,1.80),'5':(0,2)}    

nx.set_node_attributes (G,'ordin ', Pos)

Я должен добавить более 1500 узлов к графику с метками несколько раз, поэтому я не хочу использовать «для» l oop, я ищу эффективное выделение, а не как:

G2.add_node(1,pos=(1,0))

Может кто-нибудь найти способ?

1 Ответ

1 голос
/ 01 апреля 2020

Вы можете установить атрибуты position всех узлов одновременно через function.set_node_attributes, что принимает параметр values, который может быть словарем со структурой {node0: {'attr1': 20, 'attr2': 'nothing'}, node1: {'attr2': 3}}. Следовательно, в этом примере вы можете непосредственно сделать:

G = nx.Graph()
G.add_nodes_from(pos)
G.nodes(True)
# NodeDataView({0: {}, 1: {}, 2: {}, 3: {}})

Теперь мы можем напрямую function.set_node_attributes передать словарь как:

pos = {0: (1,1), 1: (2,2), 2: (3,2), 3: (4,3)}
nx.set_node_attributes(G, pos, 'pos')

А теперь, напечатав NodeDataView, вы get:

G.nodes(True)
# NodeDataView({0: {'pos': (1, 1)}, 1: {'pos': (2, 2)}, 2: {'pos': (3, 2)}, 3: {'pos': (4, 3)}})

Таким образом, если бы вы рисовали график, вы могли бы установить позиции в параметре pos nx.draw:

nx.draw(G, node_color='lightblue', with_labels=True, pos=pos, node_size=500)

enter image description here

...