2017-02-16 4 views
0

В простом графике, как это:NetworkX: как назначить координаты узлов как атрибут?

import networkx as nx 
import matplotlib.pyplot as plt 

G = nx.Graph() 
G.add_edge('0','1') 
G.add_edge('1','2') 
G.add_edge('2','0') 
G.add_edge('0','3') 
G.add_edge('1','4') 
G.add_edge('5','0') 

pos={'0':(1,0),'1':(1,1),'2':(2,3),'3':(3,2),'4':(0.76,1.80),'5':(0,2)} #node:(x,y) 
nx.draw(G,pos=pos,with_labels=True) 
plt.show() 

при попытке присвоить каждому узлу список атрибутов, содержащих идентификатор узла и его (x,y) координаты, как это:

for i,n in enumerate(G.nodes()): 
    G.nodes()[i]['weight']=[G.nodes()[i],pos[n]] #List of attributes 

я получаю следующее сообщение об ошибке :

Traceback (most recent call last): 

    File "<ipython-input-47-0f9ca94eeefd>", line 2, in <module> 
    G.nodes()[i]['weight']=[G.nodes()[i],pos[n]] 

TypeError: 'str' object does not support item assignment 

Что здесь не так?

ответ

2

После небольшого исследования я выяснил, что ответ находится в nx.set_node_attributes().

Это, конечно, можно присвоить позиции узла в качестве атрибутов:

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, 'coord', pos) 

, что приводит к

In[1]: G.nodes(data=True) 
Out[1]: 
[('1', {'coord': (1, 1)}), #each node has its own position 
('0', {'coord': (1, 0)}), 
('3', {'coord': (3, 2)}), 
('2', {'coord': (2, 3)}), 
('5', {'coord': (0, 2)}), 
('4', {'coord': (0.76, 1.8)})] 

и также можно прикрепить несколько атрибутов, используя специальные словари (в данном случае test), которые не должны иметь одинаковое количество элементов, таких как узлы в G (например, могут быть узлы без атрибутов):

test={'0':55,'1':43,'2':17,'3':86,'4':2} #node '5' is missing 
nx.set_node_attributes(G, 'test', test) 

что приводит к

In[2]: G.nodes(data=True) 
Out[2]: 
[('1', {'coord': (1, 1), 'test': 43}), 
('0', {'coord': (1, 0), 'test': 55}), 
('3', {'coord': (3, 2), 'test': 86}), 
('2', {'coord': (2, 3), 'test': 17}), 
('5', {'coord': (0, 2)}), 
('4', {'coord': (0.76, 1.8), 'test': 2})] 

Я предполагаю, что то же самое можно с ребрами графа, используя nx.set_edge_attributes().

+0

Как узнать созданные им координаты узла и сохранить их для дальнейшего использования в другом графике? – Sigur

+0

@Sigur координаты узла в этом примере были составлены. Это зависит от проблемы, которую вы пытаетесь решить, но вы можете назначить узлы координаты, которые вы хотите - вы сами решаете! Они могут храниться в словаре, который затем может быть сохранен как [pickle] (https://docs.python.org/3/library/pickle.html). Это позволяет импортировать и распаковывать рассол, поэтому вы можете использовать его с другим графиком позже. Надеюсь, это поможет. Если у вас есть более конкретная проблема, задайте новый вопрос со всеми подробностями. – FaCoffee

+0

Позвольте мне немного рассказать об этом. Более или менее то, что я хочу, это последовательность графиков с одинаковым набором вершин, но ребра появляются в соответствии с некоторым параметром. Но позиция набора вершин создается сначала каким-то макетом, а затем для других графиков я бы хотел использовать их. Но каждый раз, когда я запускаю код, график меняется! – Sigur

Смежные вопросы