2017-02-16 6 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() 

私は、各ノードにノードIDを含む属性のリストを割り当てようとその(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()であることを理解しました。

属性としてノード位置を割り当てることがもちろん可能である。

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)})] 

をもたらし、この場合には(専用の辞書を使用して複数の属性を添付することも可能である

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) 

test)は、Gのノードと同じ数の要素を持つ必要はありません(たとえば、ノードがであり、属性がでない場合があります)。

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})] 

もたらす

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

Iは、nx.set_edge_attributes()を使用して、グラフのエッジに同じが可能であることを推測しています。

+0

それによって作成されたノード座標を知り、後で別のグラフで使用するために保存する方法は? – Sigur

+0

@Sigurこの例では、ノード座標が構成されていました。これはあなたが解決しようとしている問題に依存しますが、ノードにあなたが望む座標を割り当てることができます。これらはディクショナリに保存でき、[pickle](https://docs.python.org/3/library/pickle.html)として保存することができます。これにより、ピックルのインポートとアンパックが可能になるため、後で別のグラフで使用することができます。私はこれが役立つことを願っていますより具体的な問題がある場合は、すべての詳細について新しい質問をしてください。 – FaCoffee

+0

私は少しそれを検索させてください。多かれ少なかれ、同じ頂点セットを持つ一連のグラフがありますが、いくつかのパラメータに応じてエッジが現れます。しかし、頂点セットの位置は、最初はレイアウトによって作成され、次に他のグラフでは同じものを使用したいと思います。しかし、コードを実行するたびにグラフが変わります! – Sigur

関連する問題