9

matplotlib.ArtistAnimation2 つのサブプロットをアニメーション化するために使用しようとしています。アニメーションの全長が 100 になるように、アニメーションが進行するにつれて x 軸の値を増やしたいのですが、いつでもサブプロットは 0 ~ 24 の時間値のみを表示し、100 まで繰り返します。

良い例をここに示します。このリンクは、x 値を使用してインクリメントFuncAnimationするローリング方式で x 軸ラベルを使用および更新します。plot().axes.set_xlim()コードは、提供されたリンクの YouTube ビデオの下のリンクから入手できます。

これらの結果を複製しようとする試みを示すコードを以下に追加しましたが、x 制限は時間とともにインクリメントするのではなく、最終的な値を取るようです。また、サブプロットに表示されるウィンドウ内の値をプロットするだけで (軸とは対照的に) ソリューションをインクリメントしようとしましたが、x 軸の値はインクリメントされません。自動スケーリングも実装しようとしましたが、x 軸はまだ更新されません。

実質的に同じ問題であるこの質問も見つけましたが、質問には答えられませんでした。

これが私のコードです:

import matplotlib.pylab as plt
import matplotlib.animation as anim
import numpy as np

#create image with format (time,x,y)
image = np.random.rand(100,10,10)

#setup figure
fig = plt.figure()
ax1=fig.add_subplot(1,2,1)
ax2=fig.add_subplot(1,2,2)
#set up viewing window (in this case the 25 most recent values)
repeat_length = (np.shape(image)[0]+1)/4
ax2.set_xlim([0,repeat_length])
#ax2.autoscale_view()
ax2.set_ylim([np.amin(image[:,5,5]),np.amax(image[:,5,5])])

#set up list of images for animation

ims=[]
for time in xrange(np.shape(image)[0]):

    im = ax1.imshow(image[time,:,:])
    im2, = ax2.plot(image[0:time,5,5],color=(0,0,1))
    if time>repeat_length:
        lim = ax2.set_xlim(time-repeat_length,time)

    ims.append([im, im2])


#run animation
ani = anim.ArtistAnimation(fig,ims, interval=50,blit=False)
plt.show()

2 番目のサブプロット ( ax2) で x 軸の値を更新するだけです。

どんな助けでも大歓迎です。

4

3 に答える 3

9

ブリッティングが必要ない場合

import matplotlib.pylab as plt
import matplotlib.animation as animation
import numpy as np

#create image with format (time,x,y)
image = np.random.rand(100,10,10)

#setup figure
fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
#set up viewing window (in this case the 25 most recent values)
repeat_length = (np.shape(image)[0]+1)/4
ax2.set_xlim([0,repeat_length])
#ax2.autoscale_view()
ax2.set_ylim([np.amin(image[:,5,5]),np.amax(image[:,5,5])])

#set up list of images for animation


im = ax1.imshow(image[0,:,:])
im2, = ax2.plot([], [], color=(0,0,1))

def func(n):
    im.set_data(image[n,:,:])

    im2.set_xdata(np.arange(n))
    im2.set_ydata(image[0:n, 5, 5])
    if n>repeat_length:
        lim = ax2.set_xlim(n-repeat_length, n)
    else:
        # makes it look ok when the animation loops
        lim = ax2.set_xlim(0, repeat_length)
    return im, im2

ani = animation.FuncAnimation(fig, func, frames=image.shape[0], interval=30, blit=False)

plt.show()

動作します。

より速く実行する必要がある場合は、軸ラベルが更新されるように、ブリットに使用される境界ボックスでゲームをプレイする必要があります。

于 2013-07-27T22:37:25.910 に答える
0

これは軸を動かしますが、非常に遅いです。

import matplotlib.pylab as plt
import matplotlib.animation as anim
import numpy as np


image = np.random.rand(100,10,10)
repeat_length = (np.shape(image)[0]+1)/4

fig = plt.figure()
ax1 = ax1=fig.add_subplot(1,2,1)
im = ax1.imshow(image[0,:,:])

ax2 = plt.subplot(122)
ax2.set_xlim([0,repeat_length])
ax2.set_ylim([np.amin(image[:,5,5]),np.amax(image[:,5,5])])
im2, = ax2.plot(image[0:0,5,5],color=(0,0,1))

canvas = ax2.figure.canvas

def init():
    im = ax1.imshow(image[0,:,:])
    im2.set_data([], [])
    return im,im2,

def animate(time):
    time = time%len(image)
    im = ax1.imshow(image[time,:,:])
    im2, = ax2.plot(image[0:time,5,5],color=(0,0,1))
    if time>repeat_length:
        print time
        im2.axes.set_xlim(time-repeat_length,time)
        plt.draw()
    return im,im2,

ax2.get_yaxis().set_animated(True)

# call the animator.  blit=True means only re-draw the parts that have changed.
animate = anim.FuncAnimation(fig, animate, init_func=init,
                               interval=0, blit=True, repeat=True)

plt.show()
于 2013-07-27T11:34:16.007 に答える