2016-03-31 12 views
0

私はNxNの通常のネットワークで作業しており、そののエッジの長さの分布をプロットしたいと思います。Python:通常のネットワークのエッジの長さの分布

これは私がネットワークを生成する方法である:

import networkx as nx 
import matplotlib.pyplot as plt 
N=30 #This can be changed 
G=nx.grid_2d_graph(N,N) 
pos = dict((n, n) for n in G.nodes()) 
labels = dict(((i, j), i + (N-1-j) * N) for i, j in G.nodes()) 
nx.relabel_nodes(G,labels,False) 
inds=labels.keys() 
vals=labels.values() 
inds.sort() 
vals.sort() 
pos2=dict(zip(vals,inds)) 
nx.draw_networkx(G, pos=pos2, with_labels=False, node_size = 15) 

は、これは私が、エッジの長さの分布を計算する方法である:

def plot_edge_length_distribution(): #Euclidean distances from all nodes 
    lengths={} 
    for node in G.nodes(): 
     neigh=nx.all_neighbors(G,node) #The connected neighbors of node n 
     for n in neigh: 
      lengths[node]=((pos2[n][1]-pos2[node][1])**2)+((pos2[n][0]-pos2[node][0])**2) #The square distance 
    items=sorted(lengths.items()) 
    fig=plt.figure() 
    ax=fig.add_subplot(111) 
    ax.plot([k for (k,v) in items],[v/(num_edges) for (k,v) in items],'ks-') 
    ax.set_xscale("linear") 
    ax.set_yscale("linear") 
    plt.yticks(numpy.arange(0.94, 1.00, 0.02)) 
    title_string=('Edge Length Distribution') 
    subtitle_string=('Lattice Network | '+str(N)+'x'+str(N)+' nodes') 
    plt.suptitle(title_string, y=0.99, fontsize=17) 
    plt.title(subtitle_string, fontsize=9) 
    plt.xlabel('Edge Length L') 
    plt.ylabel('p(L)') 
    ax.grid(True,which="both") 
    plt.show() 
plot_edge_length_distribution() 

これは私が得るものです:辞書として間違って何かがあるlengths通常のグリッドの性質上、値として1つだけを含める必要があります。

これは私が欲しいものです:普通のグリッドは長さ1のエッジしか持たないので、長さ= 1と言うプロットは確率p(l)= 1を持っています。私のコードで何が間違っていますか?

+0

アイテムに(K、V)のための[K '' items'の値を印刷する最初の試み] 'と' [v /(num_edges)for(k、v)for items] 'のようになります。 – JulienD

答えて

2

それはエッジを反復し、それぞれに距離を計算するために簡単かつ迅速です:

In [1]: import networkx as nx 

In [2]: from math import sqrt 

In [3]: from collections import Counter 

In [4]: G = nx.grid_2d_graph(100,100) 

In [5]: d = Counter(sqrt((x-a)**2 + (y-b)**2) for (x,y),(a,b) in G.edges()) 

In [6]: print(d) 
Counter({1.0: 19800}) 
+0

「19800」とは何ですか?ああ、エッジの総数。 – FaCoffee

関連する問題