[Solved] Little issue with blitting technique

Hey, coparing on how GTK2 example is done I’ve seen a difference between the two!

In QT4Agg example and WX example the code use:

canvas.copy_from_bbox(ax.bbox)
replacing all occurrence of ax.bbox with ax.get_figure().bbox solved all the issue I add.

I’m not sure why using ax.bbox does not work, and it SHOULD work.
Note that animation_blit_gtk.py DOES
use ax.bbox.

Perhaps we should correct the examples.
I can send you the good working example if you want.

If using ax.bbox does not work, than it is a bug (either mpl or the example).
Unfortunately, this seems to happen only on windows.
So, please file a bug report (again).

Regards,

-JJ

Hy guys,

Just saw your posts. I don’t understand the business with the ax.get_figure().bbox.

I’m also using windows, and a modified version of the animation_blit_tk.py using imshow work fine for me.

I just checked whether the get_figure() changes anything and I get exactly the same result in terms of performance.

I attach the code below if it can be of any use.

Cheers,

Auré

For detailed comments on animation and the techniqes used here, see

the wiki entry http://www.scipy.org/Cookbook/Matplotlib/Animations

import matplotlib
matplotlib.use(‘TkAgg’)

import sys
import pylab as p
import matplotlib.numerix as nx
import time

from FileUtils10 import fileHandling

for profiling

tstart = time.time()
tprevious = time.time()

fnamelist = [‘…’]

ax = p.subplot(111)
canvas = ax.figure.canvas

print 't1 ',time.time()-tprevious
tprevious = time.time()

create the initial line

dataarr = fileHandling(fnamelist[0]).read()
#print dataarr.dtype
#dataarr = dataarr.astype(‘uint8’)
print 't2 ',time.time()-tprevious
tprevious = time.time()

image = p.imshow(dataarr, animated=True)
print 't3 ',time.time()-tprevious
tprevious
= time.time()

def run(*args):
tprevious = time.time()
background = canvas.copy_from_bbox(ax.bbox)
print 't4 ',time.time()-tprevious
tprevious = time.time()
while 1:
#print fnamelist[run.cnt]
# restore the clean slate background
canvas.restore_region(background)
print 't5 ',time.time()-tprevious
tprevious = time.time()
# update the data
dataarr = fileHandling(fnamelist[run.cnt]).readMCCD()
dataarr *= run.cnt
print 't6
',time.time()-tprevious
tprevious = time.time()
image.set_data(dataarr)
print 't7 ',time.time()-tprevious
tprevious = time.time()
# just draw the animated artist
ax.draw_artist(image)
print 't8 ',time.time()-tprevious
tprevious = time.time()
# just redraw the axes rectangle
canvas.blit(ax.bbox)
print 't9 ',time.time()-tprevious
tprevious = time.time()

     if

fnamelist[run.cnt] == fnamelist[-1]:
# print the timing info and quit
print ‘total time:’ , time.time()-tstart
print ‘FPS:’ , 1000./(time.time()-tstart)
p.close(‘all’)
sys.exit()

    run.cnt += 1

run.cnt = 0

p.subplots_adjust(left=0.3, bottom=0.3) # check for flipy bugs
p.grid() # to ensure proper background restore
manager = p.get_current_fig_manager()
manager.window.after(100, run)

p.show()

···

On Tue, Oct 13, 2009 at 5:06 PM, Laurent Dufr?chou ><laurent.dufrechou@…287…> wrote:

Hi Auré,

Taking this example (FPS is computed at the end of the loop each
100 frames):

(this is the same example as you but not using FileUtils10)

···

################################################

import sys

import pylab as p

import numpy as npy

import time

ax2 = p.subplot(212)

ax = p.subplot(211)

canvas = ax.figure.canvas

create the initial line

x = npy.arange(0,2*npy.pi,0.01)

line, = p.plot(x, npy.sin(x), animated=True, lw=2)

def run(*args):

background = canvas.copy_from_bbox(ax.bbox)

for profiling

tstart = time.time()

while 1:

restore the clean slate background

canvas.restore_region(background)

update the data

line.set_ydata(npy.sin(x+run.cnt/10.0))

just draw the animated artist

ax.draw_artist(line)

just redraw the axes rectangle

canvas.blit(ax.bbox)

if run.cnt==100:

print the timing info and quit

print ‘FPS:’ , 100/(time.time()-tstart)

return

run.cnt += 1

run.cnt = 0

p.subplots_adjust(left=0.3, bottom=0.3) # check for flipy bugs

p.grid() # to ensure proper background restore

manager = p.get_current_fig_manager()

manager.window.after(100, run)

p.show()

################################################

This example will work on my machine @99FPS.

Now replace:

ax2 = p.subplot(212)

ax = p.subplot(211)

with:

ax = p.subplot(212)

ax2 = p.subplot(211)

The image is buggy because the blitting is no more working,
still I get 86FPS. So let say no change.

Now replace “ax.bbox” with ”ax.get_figure().bbox”:

The bug disappear and I get a small 20 FPS…

Tested under windows vista , matplotlib 0.99.1, python 2.5.4.

Laurent

Ps: I think ax.getFigure().bbox is getting the whole picture so
this is why it is slower.

**De :** Auré Gourrier
[mailto:aurelien.gourrier@...136...]
**Envoyé :** jeudi 15 octobre 2009 10:32
**À :** matplotlib-users@lists.sourceforge.net
**Objet :** Re: [Matplotlib-users] [Solved] Little issue with blitting
technique

>On Tue, Oct 13, 2009 at 5:06 PM, Laurent Dufr?chou ><laurent.dufrechou@...287...> wrote:
>> Hey, coparing on how GTK2 example is done I've seen a difference
between the two!
>>
>> In QT4Agg example and WX example the code use:
>>
>> canvas.copy_from_bbox(ax.bbox)
>> replacing all occurrence of ax.bbox with ax.get_figure().bbox solved
all the issue I add.
>>
>
>I'm not sure why using ax.bbox does not work, and it SHOULD work.
>Note that animation_blit_gtk.py DOES use ax.bbox.
>
>> Perhaps we should correct the examples.
>> I can send you the good working example if you want.
>
>If using ax.bbox does not work, than it is a bug (either mpl or the
example).
>Unfortunately, this seems to happen only on windows.
>So, please file a bug report (again).
>
>Regards,
>
>-JJ
>

Hy guys,

Just saw your posts. I don't understand the business with the
ax.get_figure().bbox.
I'm also using windows, and a modified version of the animation_blit_tk.py
using imshow work fine for me.
I just checked whether the get_figure() changes anything and I get exactly the
same result in terms of performance.
I attach the code below if it can be of any use.

Cheers,

Auré

# For detailed comments on animation and the techniqes used here, see
# the wiki entry [http://www.scipy.org/Cookbook/Matplotlib/Animations](http://www.scipy.org/Cookbook/Matplotlib/Animations)

import matplotlib
matplotlib.use('TkAgg')

import sys
import pylab as p
import matplotlib.numerix as nx
import time

from FileUtils10 import fileHandling

# for profiling
tstart = time.time()
tprevious = time.time()

fnamelist = ['....']

ax = p.subplot(111)
canvas = ax.figure.canvas

print 't1 ',time.time()-tprevious
tprevious = time.time()

# create the initial line
dataarr = fileHandling(fnamelist[0]).read()
#print dataarr.dtype
#dataarr = dataarr.astype('uint8')
print 't2 ',time.time()-tprevious
tprevious = time.time()

image = p.imshow(dataarr, animated=True)
print 't3 ',time.time()-tprevious
tprevious = time.time()

def run(*args):
    tprevious = time.time()
    background = canvas.copy_from_bbox(ax.bbox)
    print 't4 ',time.time()-tprevious
    tprevious = time.time()
    while 1:
        #print fnamelist[run.cnt]
        # restore the clean slate background
        canvas.restore_region(background)
        print 't5 ',time.time()-tprevious
        tprevious = time.time()
        # update the data
        dataarr =
fileHandling(fnamelist[run.cnt]).readMCCD()
        dataarr *= run.cnt
        print 't6 ',time.time()-tprevious
        tprevious = time.time()
        image.set_data(dataarr)
        print 't7 ',time.time()-tprevious
        tprevious = time.time()
        # just draw the animated artist
        ax.draw_artist(image)
        print 't8 ',time.time()-tprevious
        tprevious = time.time()
        # just redraw the axes rectangle
        canvas.blit(ax.bbox)
        print 't9 ',time.time()-tprevious
        tprevious = time.time()

        if fnamelist[run.cnt] ==
fnamelist[-1]:
            # print the
timing info and quit
            print 'total
time:' , time.time()-tstart
            print 'FPS:'
, 1000./(time.time()-tstart)
           
p.close('all')
            sys.exit()

        run.cnt += 1
run.cnt = 0

 
p.subplots_adjust(left=0.3, bottom=0.3) # check for flipy bugs
p.grid() # to ensure proper background restore
manager = p.get_current_fig_manager()
manager.window.after(100, run)

p.show()

</details>