2013-07-27 32 views
5

Tôi đang cố gắng sử dụng matplotlib.ArtistAnimation để tạo hoạt ảnh cho hai vị trí con. Tôi muốn trục x tăng giá trị khi hoạt ảnh diễn ra, sao cho tổng chiều dài của hoạt ảnh là 100 nhưng bất kỳ lúc nào subplot chỉ hiển thị cho tôi giá trị thời gian từ 0-24 và sau đó lặp lại lên tới 100.Cập nhật giá trị trục x bằng cách sử dụng hoạt ảnh matplotlib

Một ví dụ tuyệt vời được đưa ra here. Liên kết sử dụng FuncAnimation và cập nhật các nhãn trục x theo kiểu cuộn bằng cách sử dụng plot().axes.set_xlim() và tăng giá trị x. Mã này có sẵn thông qua liên kết bên dưới video YouTube trong liên kết được cung cấp.

Tôi có mã được thêm vào bên dưới cho thấy các nỗ lực của tôi để nhân rộng các kết quả này nhưng giới hạn x dường như có giá trị cuối cùng thay vì tăng dần theo thời gian. Tôi cũng đã cố gắng tăng các giải pháp (như trái ngược với trục) bằng cách chỉ vẽ các giá trị trong cửa sổ sẽ được nhìn thấy trong subplot, nhưng điều đó không tăng giá trị trục x. Tôi cũng đã cố gắng thực hiện tự động tính toán nhưng trục x vẫn không cập nhật.

Tôi cũng tìm thấy this question hầu như là cùng một vấn đề, nhưng câu hỏi chưa bao giờ được trả lời.

Đây là mã của tôi:

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() 

Tôi chỉ muốn âm mưu phụ thứ hai (ax2) để cập nhật các giá trị trục x.

Mọi trợ giúp sẽ được đánh giá cao.

+1

http://stackoverflow.com/questions/17558096/animated-title-in-matplotlib/17562747#17562747 <- để nhận thông báo cập nhật nhãn – tacaswell

+0

http://stackoverflow.com/questions/17888593/display-sequence -of-images-using-matplotlib – tacaswell

+0

hoạt ảnh sẽ không chạy khi tôi sử dụng blit, chưa chắc chắn tại sao – abradd

Trả lời

5

Nếu bạn không cần blitting

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() 

sẽ làm việc.

Nếu bạn cần chạy nhanh hơn, bạn sẽ cần phải chơi trò chơi với hộp giới hạn được sử dụng để làm nhòe sao cho nhãn rìu được cập nhật.

+0

Tôi đã hy vọng tôi có thể làm cho nó chạy bằng cách sử dụng ArtistAnimation nhưng cuối cùng bit viên đạn và viết lại mã. Dường như nó chạy trơn tru. – abradd

0

Việc này di chuyển trục của bạn, nhưng rất chậm.

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() 
+0

Bạn không cần phải tạo lại các đối tượng 'imshow' mỗi lần, sử dụng' set_data' để thay thế. – tacaswell

0

Nếu bạn đang sử dụng đổ, bạn có thể gọi pyplot.draw() để vẽ lại toàn bộ hình, mỗi khi bạn thay đổi trục y/x.

Bản cập nhật này là toàn bộ, vì vậy tương đối chậm, nhưng có thể chấp nhận được nếu bạn không gọi nhiều mục.

Các vấn đề liên quan