2016-04-12 25 views
2

私はnetworkxを使うためにPythonを学び始めました。私はいくつかのノード(ノード0)に根ざした階層を構築しようとしており、そのノードからの距離(ホップ)に応じて色を変更したい。私は次のコードを書いていますが、なぜ色が変わっていないのかわかりません!!あなたは問題を指摘していただけますか?Python networkx:ノードがカラーリストを取得していません

import networkx as nx 
import matplotlib.pyplot as plt 
import matplotlib.cm as cmx 
import random 

# initial values of rings in nodes 
MAX_RING = 1000 

class Node: 
    count = int(0) 
    tx_range = 3 
    def __init__(self, i): 
     Node.count+= 1 
     self.id = int(i) 
     self.ring = int(MAX_RING) 
     self.x_pos = int() 
     self.y_pos = int() 
     self.parent_list = list() 
     self.nbr_list = list() 
     self.color = float() 


    def addNbr(self, nbr): 
     self.nbr_list.append(nbr) 

def createNodes(Nodes, pos, labels): 
    for i in range(num_of_nodes): 
     Nodes.append(Node(i)) 
     Nodes[i].x_pos = random.randrange(net_width) 
     Nodes[i].y_pos = random.randrange(net_hieght) 
     pos[i] = (Nodes[i].x_pos, Nodes[i].y_pos) 
     labels[i] = i 


def createEdges(Graph, Nodes, Edges): 
    for i in range(num_of_nodes): 
     for j in range(i + 1, num_of_nodes): 
      dist = ((Nodes[i].x_pos - Nodes[j].x_pos)**2 + (Nodes[i].y_pos - Nodes[j].y_pos)**2) ** 0.5 
      if dist <= Node.tx_range: 
       Graph.add_edge(i, j) 
       #Graph.add_edge(j, i) 
       Edges.append((i , j)) 
       Nodes[i].addNbr(Nodes[j]) 
       Nodes[j].addNbr(Nodes[i]) 
       print("Edge added") 

def createRings(G, Nodes, colors, VisEdges): 
    # Base station is node 0 and has ring 0 
    # find all nodes in current ring and check their neighbors to create the next ring 
    # next ring becomes current ring and repeat from previous step 
    current_ring = 0 
    current_node = Nodes[0] 
    current_node.ring = current_ring 
    # temporary set to travers all nodes initially contains the BS 
    N = [Nodes[0]] 
    while len(N) > 0: 
     node = N.pop(0) 
     for nbr in node.nbr_list: 
      # for each node check if it has a neighbor with ring less than MAX_RING 
      if nbr.ring > node.ring + 1: 
       if(nbr.ring != MAX_RING): 
        print('CHANGING PARENT') 
       nbr.ring = node.ring + 1 
       nbr.color = nbr.ring 
       N.append(nbr) 
       VisEdges.append((node.id, nbr.id)) 
    for node in Nodes: 
     colors.insert(node.id, node.color) 




def main(): 
    Nodes = list() 
    Edges = list() 
    VisEdges = list() 
    pos = dict() 
    labels = {} 
    colors = [] 
    G = nx.Graph() 
    createNodes(Nodes, pos, labels) 
    G.add_nodes_from(pos.keys()) 
    createEdges(G, Nodes, Edges) 
    for n, p in pos.items(): 
     G.node[n]['pos'] = p 

    createRings(G, Nodes, colors, VisEdges) 
    colors[0] = 1 
    for node in Nodes: 
     print('Node[',node.id,'] ring is ', node.ring, 'color is', colors[node.id]) 


    nx.draw(G,pos, edgelist=VisEdges, nodelist=pos.keys() , node_colors=colors, cmap=cmx.get_cmap('Reds'), 
      vmin=0, vmax=max(colors)) 

    nx.draw_networkx_labels(G,pos,labels,font_size=10) 
    plt.show() 



num_of_nodes = 100 
net_width = 15 
net_hieght = 15 
main() 

答えて

1

あなたの引数リストの入力ミスがnx.draw()です。それはあなたが()をnx.drawためにあなたの呼び出しにタイプミスがありnode_color、すなわち

nx.draw(G,pos, edgelist=VisEdges, nodelist=pos.keys() , node_color=colors, cmap=cmx.get_cmap('Reds'), 
     vmin=0, vmax=max(colors)) 
+0

ありがとう、私はそれを理解しようと一日を費やし、私はそれを見ることができませんでした!なぜそれがPythonインタプリタによって検出されなかったのですか? – osmak

1

でなければなりません。このタイプミスは、関数に必要なキーワード引数を渡すことができるので、インタプリタによって捕捉されませんでした。特定のキーワードが使用されたり使用されたりするだけです。

関連する問題