Re: [Matplotlib-users] Animating plots with the Qt backend

2011-05-05 Thread Benjamin Root
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.

Re: [Matplotlib-users] Animating plots with the Qt backend

2011-05-05 Thread Gerald Storer

Ah,
I did not know that. I shall investigate.

Thanks,
Gerald.

On 6/05/2011 7:27 AM, Benjamin Root wrote:



On Tue, May 3, 2011 at 3:57 AM, Gerald Storer g...@mrxtech.com.au 
mailto: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 http://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 

[Matplotlib-users] Animating plots with the Qt backend

2011-05-03 Thread Gerald Storer
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_())



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