Как ускорить анимацию?

Я пытаюсь создать анимацию Matplotlib данных моей лапы, где вы можете увидеть распределение давления на всю нажимную пластину со временем (256x64 датчиков на 250 кадров).

Я нашел рабочий пример на собственном сайте Matplotlib и смог заставить его работать над моими собственными данными. Однако "анимация" ужасно медленная, и я не знаю, как ее ускорить.

Вот пример gif Joe Kington сделанный в другом ответе, который касается скорости, с которой он отображается. Учитывая, что измерения выполняются на частоте 125 Гц, это делает измерения очень ужасными. Если он работает со скоростью 30-60 кадров в секунду, его можно запустить за 4 или 8 секунд, а не за текущие 20 +.

enter image description hereenter image description here

Я не возражаю против использования любого инструмента, который мне нужен для выполнения этой работы, пока есть хорошая документация, чтобы выяснить, как это сделать.

Итак, мой вопрос: как ускорить эти анимации?

Я внедрил предложение Ignacio для ввода t.Start(1), однако он работает только "прилично", когда на рисунке это большое:

enter image description here

class PlotFigure(Frame):
    """ This class draws a window and updates it with data from DataCollect
    """
    def __init__(self):
        Frame.__init__(self, None, -1, "Test embedded wxFigure")
        #Varying the size of Figure has a big influence on the speed            
        self.fig = Figure((3,3), 75) 
        self.canvas = FigureCanvasWxAgg(self, -1, self.fig)
        EVT_TIMER(self, TIMER_ID, self.onTimer)

    def init_plot_data(self):
        self.datagen = DataCollect(array3d)
        self.axes = self.fig.add_subplot(111)
        self.axes.imshow(self.datagen.next().T)

    def onTimer(self, evt):
        self.data = self.datagen.next()
        self.axes.imshow(self.datagen.next().T)
        self.canvas.draw()

Когда я изменяю размер окна во время анимации, он немедленно замедляется до обхода. Это заставляет меня подозревать, что задержка не является единственной причиной замедления. Итак, любые другие предложения? Если вам интересно, здесь ссылка на один из файлов ASCII.

Ответ 1

Я нашел ответ Джо Кингтона, который упомянул об использовании Glumpy. Сначала я не мог заставить его работать с моими собственными данными, но с некоторой помощью в чате нам удалось выяснить, как адаптировать один из примеров Matplotlib, который поставляется с Glumpy для работы с моими данными.

import numpy, glumpy
from glumpy.pylab import *

window = glumpy.Window(256,64)
Z = data.astype(numpy.float32)

t0, frames, t = 0,0,0
fig = plt.figure(figsize=(7,7))
ax = plt.subplot(111)
ax = imshow(Z[:,:,0], origin='lower', interpolation='bilinear')
show()
window = glumpy.active_window()

@window.event
def on_idle(dt):    
    global Z, t0, frames, t

    t += dt
    frames = frames + 1
    if frames > 248:
        fps = float(frames)/(t-t0)
        print 'FPS: %.2f (%d frames in %.2f seconds)' % (fps, frames, t-t0)
        frames,t0 = 0, t

    for image, axis, alpha in items:
        image.data[...] = Z[:,:,frames]
        image.update()
    window.draw()

window.mainloop()

Здесь можно увидеть конечный результат, неважно, насколько велика я создаю окно, оно будет работать с очень устойчивым 58 + fps. Поэтому я должен сказать, что я очень доволен конечным результатом!

enter image description here

Ответ 2

Значение, переданное в wx.Timer.Start(), - это скорость запуска в миллисекундах. Передайте меньшее значение.