3

だから私はnetworkxの例からこのコードを持っていますが、円の境界内でランダムな幾何学的グラフをグラフ化するために、ノードを半径「r」内に制限する方法を見つけようとしています。論理的にどのように行うかはわかっていますが、すべてがどのように機能するかについて少し混乱しており、これまでのところ解決策がなく、自分で理解しようとしています. 助けてくれてありがとう!

import networkx as nx
import matplotlib.pyplot as plt

G = nx.random_geometric_graph(1000,0.1)

# position is stored as node attribute data for random_geometric_graph
pos = nx.get_node_attributes(G,'pos')

# find node near center (0.5,0.5)
dmin =1
ncenter =0
for n in pos:
    x,y = pos[n]
    d = (x-0.5)**2+(y-0.5)**2
    if d<dmin:
        ncenter = n
        dmin = d

# color by path length from node near center
p = nx.single_source_shortest_path_length(G,ncenter)

plt.figure(figsize=(8,8))
#node_color=p.values()
nx.draw_networkx_edges(G,pos,nodelist=[ncenter],alpha=0.4)
nx.draw_networkx_nodes(G,pos,nodelist=p.keys(),
                   node_size=80,
                   node_color='#0F1C95',
                   cmap=plt.cm.Reds_r)

plt.xlim(-0.05,1.05)
plt.ylim(-0.05,1.05)
plt.axis('off')
plt.savefig('random_geometric_graph.png')
plt.show()
4

2 に答える 2

5

次のような辞書内包表記を使用できます

p = {node:length for node, length in nx.single_source_shortest_path_length(G,ncenter).items()
     if length < 5}

からの距離が 5 未満のノードに dict を制限しncenterます。

Python2.6以前の場合、使用できます

p = dict((node, length) for node, length in nx.single_source_shortest_path_length(G,ncenter).items()
     if length < 5)

交換することもできます

dmin =1
ncenter =0
for n in pos:
    x,y = pos[n]
    d = (x-0.5)**2+(y-0.5)**2
    if d<dmin:
        ncenter = n
        dmin = d

ワンライナーで:

ncenter, _ = min(pos.items(), key = lambda (node, (x,y)): (x-0.5)**2+(y-0.5)**2)

からの距離が 5 未満のノードのみを描画ncenterするには、サブグラフを定義します。

H = G.subgraph(p.keys())    
nx.draw_networkx_edges(H, pos, alpha = 0.4)
nx.draw_networkx_nodes(H, pos, node_size = 80, node_color = node_color,
                       cmap = plt.get_cmap('Reds_r'))

import networkx as nx
import matplotlib.pyplot as plt
G = nx.random_geometric_graph(1000, 0.1)

# position is stored as node attribute data for random_geometric_graph
pos = nx.get_node_attributes(G, 'pos')

# find node near center (0.5,0.5)
ncenter, _ = min(pos.items(), key = lambda (node, (x, y)): (x-0.5)**2+(y-0.5)**2)

# color by path length from node near center
p = {node:length
     for node, length in nx.single_source_shortest_path_length(G, ncenter).items()
     if length < 5}

plt.figure(figsize = (8, 8))
node_color = p.values()
H = G.subgraph(p.keys())    
nx.draw_networkx_edges(H, pos, alpha = 0.4)
nx.draw_networkx_nodes(H, pos, node_size = 80, node_color = node_color,
                       cmap = plt.get_cmap('Reds_r'))

plt.xlim(-0.05, 1.05)
plt.ylim(-0.05, 1.05)
plt.axis('off')
plt.savefig('random_geometric_graph.png')
plt.show()

ここに画像の説明を入力

于 2012-12-09T21:50:05.197 に答える
1

KDツリーを使用したNetworkXランダムジオメトリックグラフの実装に関する質問の回答は、 これをより効率的に行うために使用できます。

import numpy as np
from scipy import spatial
import networkx as nx
import matplotlib.pyplot as plt
n = 100
radius = 0.4
# random sample n points in disc using rejection
positions =  np.random.uniform(low=-radius, high=radius, size=(n*2.0,2))
disc = np.array([p for p in positions if np.linalg.norm(p) < radius][0:n])
# kdtree data structure of points in disc
kdtree = spatial.KDTree(disc)
# make graph
G = nx.Graph()
G.add_nodes_from(range(n))
r = 0.1 # connect nodes if distance < r
pairs = kdtree.query_pairs(r)
G.add_edges_from(list(pairs))
# draw
pos = dict(zip(range(n),disc))
nx.draw(G,pos,with_labels=False,node_size=25)
circ=plt.Circle((0,0),radius=radius,alpha=0.1)
ax=plt.gca()
plt.axis('equal')
ax.add_patch(circ)
plt.savefig('disc.png')
plt.show()

ここに画像の説明を入力してください

于 2012-12-14T03:34:36.777 に答える