2012-02-23 5 views
4

私はこのquestionに似た質問がありますが、非常に多くのポイントをプロットするのではなく、ポイントとエッジの数を少なくして(少なくとも10因子)、アニメーションしたいそれら。具体的には、それが進化し、変形平方latticのように見える2Dマップとコホーネンネットワークの可視化である、ウィキペディアからこの画像を参照してください。this答えからコードを撮影エッジで結ばれたポイントのグラフをアニメ化する

image

ビットを変更し、最小の例は次のようになります

import numpy as np 
import matplotlib.pyplot as plt 

def getXY(points, edges): 
    """Return x and y arrays to pass to the plot function""" 
    return [points.T[i][edges.T] for i in np.arange(points.shape[1])] 

points = numpy.array([[1,2],[4,5],[2,7],[3,9],[9,2]]) 
edges = numpy.array([[0,1],[3,4],[3,2],[2,4]]) 

lines = plt.plot(*getXY(points, edges), linestyle='-', color='y', 
     markerfacecolor='red', marker='o') 
plt.show() 

そして、更新ポイントの座標を変更する起こる:

points += 1 # simplified version of a real update 

変更されませんプロットウィンドウ内の他のデータがあるので、私は、すべてを再プロットする「愚かな」道を避けたい、また、これは本当に遅いです:最初のステップとして

# repeat after each update all the calculation 
plt.cla() 
x, y = [points.T[i][edges.T] for i in np.arange(points.shape[1])] 
lines = plt.plot(x, y, linestyle='-', color='y', 
     markerfacecolor='red', marker='o') 
plt.show() 

、私が保存されて変数linesの初期プロットから作成されたLine2Dデータ 私が今直面している問題は、私がラインデータを更新したい場合、私が思いつくことができる唯一の解決策は、私にはあまりエレガントではないすべてのラインを繰り返し処理する必要があるということです:

x, y = getXY(points, edges) 
if len(lines) > 1: 
    for i, d in enumerate(zip(x.T, y.T)): 
     lines[i].set_data(d) 
else: # has to be treated seperately, since the format of x and y is different 
    lines[0].set_data(x, y) 
plt.show() 
私は

  • は、初期の問題を解決する方法についての私のforループ
  • アイデア(指定した接続でのポイントをプロット)より良い解決策を考え出すどのように...提案を探しています

    よりエレガントな方法

答えて

0

これが可能な方法の1つです。行の座標にNaNまたはNoneがある場合、これは本質的に線分の終わりとして扱われるという事実を使うことができます。次のnon-noneポイントは新しいセグメントの始まりとして扱われます。例えばあなただけ行うことができます0.2で0.1とy軸でx軸をシフト座標を更新するために今すぐ

import numpy as np, matplotlib.pyplot as plt 
x,y = np.array([1, 4,2, 3, 9]), np.array([2, 5, 7, 9, 2]) 

edges = np.array([[0, 1], 
    [3, 4], 
    [3, 2], 
    [2, 4], 
    [2, 1]]) 

ys=np.vstack((y[edges[:,0]],y[edges[:,1]],y[edges[:,0]]+np.nan)).T.flatten() 

xs=np.vstack((x[edges[:,0]],x[edges[:,1]],x[edges[:,0]]+np.nan)).T.flatten() 

lines2d = plt.plot(xs,ys,marker='o') 

(:

oldx,oldy=lines2d[0].get_data() 
lines2d[0].set_data(oldx+.1,oldy+.2) 
plt.draw() 

PS私はその完全にわからないんだけど、私のxs、ys配列にNansを挿入する方法が最も速いですが、おそらくそれほど重要ではありません。

関連する問題