0

フィルターの変換を可視化したい。次のフィルターの値が 0.5 秒ごとにプロットされる散布図をプロットしたいと思います。

私の目標は次のとおりです。

  1. ポイント (k) までのすべての値をプロットしますが、値 (k) をプロットに示します。

  2. (k) と (k+1) のプロット値の間で一時停止

  3. フルスクリーンでプロット

  4. すべての反復を終了した後にプロットを作成する

関数を実行しましたが、非常に非効率的で、いくつかの値をプロットするとすべてが遅くなります。

私が見つけた唯一の方法は、対話型プロットを使用しion()、すべてのステップが更新されたマーカーですべてのポイントを再度プロットすることです。各ステップ(k)で、以前のポイント(k-1)を削除し、別のマーカーでそれらを追加し、現在のポイント(k)を追加したいと思います

import pylab as pl
import time
xPos1 = pl.arange(100)
m1 = [pl.sin(pl.pi*x/10) for x in xPos1]
m2 = [pl.cos(pl.pi*x/30) for x in xPos1]
m3 = [pl.sin(pl.pi*x/20) for x in xPos1]
trueVal1 = [0 for real in xPos1] 

def conversionAnim(xPos, trueVal, *args):    
    mTuple = [arg for arg in args]
    colorList = ['Green','Blue','Orchid','Cyan','Goldenrod','Salmon','Orange','Violet','Magenta']
    f = pl.figure(figsize =(17,8))
    pl.ion()
    pl.xlim(min(xPos)-1, max(xPos)+1)
    pl.ylim(min(j for i in mTuple for j in i)-.5, max(j for i in mTuple for j in i)+.5)
    for i in range(len(xPos)):
        print '\ni = %i' % i 
        for j in range(len(mTuple)):
            m = mTuple[j]            
            mVal = [element for element in m] 
            print 'Value%i is %s' %(j,mVal[i])       
            if i == 0:
                pl.hold(True)
                pl.scatter(xPos[i],mVal[i],s=50, marker = 'o', color = 'Dark'+colorList[j])
                pl.plot(xPos[i],trueVal[i])                
            else:

                pl.scatter(xPos[i],mVal[i],s=50, marker = 'o',color = 'Dark'+colorList[j])                
                pl.scatter(xPos[i-1], mVal[i-1],s=50, marker = 'o', color = 'white')
                pl.scatter(xPos[i-1], mVal[i-1],s=50, marker = 'x', color = colorList[j])                
                pl.plot(xPos[i-1:i+1],trueVal[i-1:i+1], color = 'red')       

            pl.draw()
        time.sleep(.01)
    time.sleep(3)  # to hold figure after its shown

if __name__ == '__main__':
    conversionAnim(xPos1, trueVal1, m1, m2, m3)

ion()この機能を回避して効率的にする方法がわかりません。

4

1 に答える 1

0

これをより効率的にする最も簡単な方法は、膨大な数のプロットの代わりに 2N ライン プロットを使用することscatterです。(すべてのデータ ポイントに対して 3 つの散布図が作成されるようです!)

mTuple = [arg for arg in args]ちなみに、タプルをlistsに変換する行 ( ) がいくつかあります。と書く方が明確mTuple = list(args)ですが、実行することすべてにイテラブルが必要なだけなので、実際にこれらの変換を行う必要はないと思います。

import itertools

def covnersion_Anim(xPos,trueVal,*args):
    mTuple = args
    plt_bulk_lst = []
    plt_head_lst = []
    color_list = ['Green','Blue','Orchid','Cyan','Goldenrod','Salmon','Orange','Violet','Magenta']
    f = plt.figure(figsize =(17,8))
    ax = plt.gca()
    ax.set_xlim([min(xPos),max(xPos)])
    ax.set_ylim([0,1])
    ms = 5
    for j,c in zip(range(len(mTuple)),itertools.cycle(color_list)):
        plt_bulk_lst.append(ax.plot([],[],color=c,ms=ms,marker='x',linestyle='none')[0])
        plt_head_lst.append(ax.plot([xPos[0]],[mTuple[j][0]],color='Dark'+c,ms=ms,marker='o',linestyle='none')[0])
    real_plt, = plot([],[],color='red')

    for j in range(1,len(xPos)):
        print j
        for hd_plt,blk_plt,m in zip(plt_head_lst,plt_bulk_lst,mTuple):
            hd_plt.set_xdata([xPos[j]])
            hd_plt.set_ydata([m[j]])

            blk_plt.set_ydata(m[:j])
            blk_plt.set_xdata(xPos[:j])

            real_plt.set_xdata(xPos[:j])
            real_plt.set_ydata(trueVal[:j])

        plt.pause(1)

    return f
covnersion_Anim(range(12),rand(12),rand(12),rand(12),rand(12))
于 2012-10-22T16:55:15.380 に答える