On Tue, May 3, 2011 at 3:57 AM, Gerald Storer <g...@mrxtech.com.au> wrote:

> Hello,
>
> I've been trying to animate some plots with the qt backend and run into
> a couple of problems.
>
> Firstly,
> I'd like to be able to update the axis limits in an automated fashion as
> the data changes size.
>
> Secondly,
> Resizing figures appears to redraw everything _but_ items with the
> animation flag.  The is causing me problems when the animation is paused
> or the frames are occurring slow enough such that there is a noticable
> period where the my lines disappear.
>
> I've sort of solved both of these problems but the solutions seem
> hackish.  In particular updating the axis limits is slowing the
> animation by 25% and toggling the animated field using the qt events
> just feels like its asking for trouble.
>
> Below is the qt animation example with my solutions.  Adjust the size of
> the plot after the animation finishes to see the effect of the resize
> hack.  I would be grateful if anyone could suggest some improvements.
>
> Thanks,
> Gerald.
>
> # For detailed comments on animation and the techniqes used here, see
>
> # the wiki entry http://www.scipy.org/Cookbook/Matplotlib/Animations
>
> import os
>
> import sys
>
> #import matplotlib
>
> #matplotlib.use('Qt4Agg')
>
> from matplotlib.figure import Figure
>
> from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as
> FigureCanvas
>
> from PyQt4 import QtCore, QtGui
>
> ITERS = 100
>
> import numpy as np
>
> import time
>
> class BlitQT(FigureCanvas):
>
>     def __init__(self):
>
>         FigureCanvas.__init__(self, Figure())
>
>         self.ax = self.figure.add_subplot(111)
>
>         #self.ax.grid()
>
>         self.draw()
>
>         self.old_size = self.ax.bbox.width, self.ax.bbox.height
>
>         self.ax_background = self.copy_from_bbox(self.ax.bbox)
>
>         self.cnt = 0
>
>         self.x = np.arange(0,2*np.pi,0.01)
>
>         self.sin_line, = self.ax.plot(self.x, np.sin(self.x),
> animated=True)
>
>         self.cos_line, = self.ax.plot(self.x, np.cos(self.x),
> animated=True)
>
>         self.draw()
>
>         self.old_limits = self.ax.get_xlim(),self.ax.get_ylim()
>
>         self.tstart = time.time()
>
>         self.maintimer = self.startTimer(10)
>
>     ## HACK for disapearing objects on resize
>
>     def resizeEvent(self,evt):
>
>         super(BlitQT,self).resizeEvent(evt)
>
>         self.sin_line.set_animated(False)
>
>     def paintEvent(self,evt):
>
>         super(BlitQT,self).paintEvent(evt)
>
>         self.sin_line.set_animated(True)
>
>     def timerEvent(self, evt):
>
>         current_size = self.ax.bbox.width, self.ax.bbox.height
>
>         if self.old_size != current_size:
>
>             self.old_size = current_size
>
>             #self.ax.clear()
>
>             #self.ax.grid()
>
>             self.draw()
>
>             self.ax_background = self.copy_from_bbox(self.ax.bbox)
>
>         self.restore_region(self.ax_background)
>
>         # update the data
>
>
> self.sin_line.set_ydata(np.sin(self.x+self.cnt/10.0)*self.cnt/100.0)
>
>
> self.cos_line.set_ydata(np.cos(self.x+self.cnt/10.0)*self.cnt/100.0)
>
>         ## HACK for updating axis limits
>
>         self.ax.relim()
>
>         self.ax.autoscale_view()
>
>         current_limits = self.ax.get_xlim(),self.ax.get_ylim()
>
>         if self.old_limits != current_limits:
>
>             self.old_limits = current_limits
>
>             self.draw()
>
>             self.ax_background = self.copy_from_bbox(self.ax.bbox)
>
>             self.blit(self.figure.bbox)
>
>
>
>         # just draw the animated artist
>
>         self.ax.draw_artist(self.sin_line)
>
>         self.ax.draw_artist(self.cos_line)
>
>         # just redraw the axes rectangle
>
>         self.blit(self.ax.bbox)
>
>         if self.cnt == 0:
>
>             # TODO: this shouldn't be necessary, but if it is excluded the
>
>             # canvas outside the axes is not initially painted.
>
>             self.draw()
>
>         if self.cnt==ITERS:
>
>             # print the timing info and quit
>
>             print 'FPS:' , ITERS/(time.time()-self.tstart)
>
>             #sys.exit()
>
>             self.killTimer(self.maintimer)
>
>         else:
>
>             self.cnt += 1
>
> app = QtGui.QApplication(sys.argv)
>
> widget = BlitQT()
>
> widget.show()
>
> sys.exit(app.exec_())
>
>
Gerald,

I haven't looked at your code, but I would like to point out that if you
wish to experiment a little further with animations in matplotlib, there is
a animation module that is in the  current development branch (but has not
been officially released).  Maybe using it might help make your code less
"hack-ish"?  We would also greatly welcome any and all comments on the
module before the next release of matplotlib.

Ben Root
------------------------------------------------------------------------------
WhatsUp Gold - Download Free Network Management Software
The most intuitive, comprehensive, and cost-effective network 
management toolset available today.  Delivers lowest initial 
acquisition cost and overall TCO of any competing solution.
http://p.sf.net/sfu/whatsupgold-sd
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to