Re: [Matplotlib-users] How to blank an area of the canvas?

2010-02-16 Thread Brendan Barnwell
Jae-Joon Lee wrote:
 I have added a bbox support for restore_region, but I'm afraid
 that this feature is not well tested. And I guess what you find
 is, unfortunately,  a bug. While I'll try to push the changes to
 the svn tomorrow, you may try to monkey-patch with following
 code.
snip

Thanks a lot, this seems to basically work.  For some reason the
bboxes are still restored at slightly the wrong place --- I have to
adjust them by one pixel in the y direction, but this is doable.

 However, while matplotlib does support some animation, I think
 you 'd better turn to another tool if you need an efficiency,

Maybe so.  What tool would you recommend for animated plots?

Best wishes,
-- Brendan Barnwell Do not follow where the path may lead. Go,
instead, where there is no path, and leave a trail. --author unknown

--
SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
http://p.sf.net/sfu/solaris-dev2dev
___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


Re: [Matplotlib-users] How to blank an area of the canvas?

2010-02-14 Thread Brendan Barnwell
Brendan Barnwell wrote:
   I'm trying to find the quickest way to erase a rectangular area of 
 the figure canvas.  I tried using canvas.restore_region with the 
 optional bbox argument, but there seems to be some mismatch between 
 the measurement units of the saved buffer object and the currently 
 shown data.  For instance, if I have a Text object on my plot, I tried 
 this:
 
 bbox = g.text.get_window_extent()
 canvas.restore_region(background, bbox)
 
 . . . but it does not correctly block out the text.  (The restored 
 rectangle from the background appears elsewhere on the axes.)  How can 
 I convert the buffer coordinates to the coordinates of the the 
 displayed plot?

I'm sorry to bump my own post, but I would really appreciate some 
help with this.  I've been wrestling with it for a couple days now, 
and I cannot figure out how the coordinate system of the saved canvas 
is related to the axes coordinates.  I have found that with 
bbox.transformed(ax.transData) I can at least get the coordinates 
scaled to fit on the axes, but they are still offset in position from 
where the box actually appears on the canvas.  I can't figure out how 
to compute this offset.

By playing around with the coordinates manually, for instance, I've 
found that adjusting x by -52 and y by 21 appears to line up the 
canvas with the axes, but I can't see where these numbers -52 and 21 
would come from.  My saved canvas buffer's get_extents() method 
returns (65, 50, 586, 443), so I thought that the appropriate offsets 
would be 65 and 50, but that doesn't work.

So, what coordinates (x1, y1, x2, y2) do I need to use in 
canvas.restore_region(savedBuffer, (x1, y1, x2, y2)) in order to 
restore precisely the area of canvas occupied by a patch drawn at axis 
coordinates (a1, b1, a2, b2)?

Thanks?
-- 
Brendan Barnwell
Do not follow where the path may lead.  Go, instead, where there is 
no path, and leave a trail.
--author unknown

--
SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
http://p.sf.net/sfu/solaris-dev2dev
___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


Re: [Matplotlib-users] How to blank an area of the canvas?

2010-02-14 Thread Jae-Joon Lee
I have added a bbox support for restore_region, but I'm afraid that
this feature is not well tested. And I guess what you find is,
unfortunately,  a bug. While I'll try to push the changes to the svn
tomorrow, you may try to monkey-patch with following code.

from matplotlib.transforms import Bbox, BboxBase
from matplotlib.backends.backend_agg import RendererAgg

def restore_region(self, region, bbox=None, xy=None):

if bbox is not None or xy is not None:
rx, ry, width, height = region.get_extents()
if bbox is None:
x1, y1, x2, y2 = region.get_extents()
elif isinstance(bbox, BboxBase):
x1, y1, x2, y2 = bbox.extents
else:
x1, y1, x2, y2 = bbox

if xy is None:
ox, oy = rx, ry
else:
ox, oy = xy

self._renderer.restore_region2(region, x1, height-y2+ry, x2,
height-y1+ry,
   ox, oy)

else:
self._renderer.restore_region(region)

RendererAgg.restore_region = restore_region

But, again, the code is not well tested and there could be another bug
(or even this patch may introduce a new bug). So, see how it works and
let know of any problem.

However, while matplotlib does support some animation, I think you 'd
better turn to another tool if you need an efficiency,

Regards,

-JJ


On Sun, Feb 14, 2010 at 2:18 PM, Brendan Barnwell brenb...@brenbarn.net wrote:
 Brendan Barnwell wrote:
       I'm trying to find the quickest way to erase a rectangular area of
 the figure canvas.  I tried using canvas.restore_region with the
 optional bbox argument, but there seems to be some mismatch between
 the measurement units of the saved buffer object and the currently
 shown data.  For instance, if I have a Text object on my plot, I tried
 this:

 bbox = g.text.get_window_extent()
 canvas.restore_region(background, bbox)

 . . . but it does not correctly block out the text.  (The restored
 rectangle from the background appears elsewhere on the axes.)  How can
 I convert the buffer coordinates to the coordinates of the the
 displayed plot?

        I'm sorry to bump my own post, but I would really appreciate some
 help with this.  I've been wrestling with it for a couple days now,
 and I cannot figure out how the coordinate system of the saved canvas
 is related to the axes coordinates.  I have found that with
 bbox.transformed(ax.transData) I can at least get the coordinates
 scaled to fit on the axes, but they are still offset in position from
 where the box actually appears on the canvas.  I can't figure out how
 to compute this offset.

        By playing around with the coordinates manually, for instance, I've
 found that adjusting x by -52 and y by 21 appears to line up the
 canvas with the axes, but I can't see where these numbers -52 and 21
 would come from.  My saved canvas buffer's get_extents() method
 returns (65, 50, 586, 443), so I thought that the appropriate offsets
 would be 65 and 50, but that doesn't work.

        So, what coordinates (x1, y1, x2, y2) do I need to use in
 canvas.restore_region(savedBuffer, (x1, y1, x2, y2)) in order to
 restore precisely the area of canvas occupied by a patch drawn at axis
 coordinates (a1, b1, a2, b2)?

 Thanks?
 --
 Brendan Barnwell
 Do not follow where the path may lead.  Go, instead, where there is
 no path, and leave a trail.
    --author unknown

 --
 SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
 Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
 http://p.sf.net/sfu/solaris-dev2dev
 ___
 Matplotlib-users mailing list
 Matplotlib-users@lists.sourceforge.net
 https://lists.sourceforge.net/lists/listinfo/matplotlib-users


--
SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
http://p.sf.net/sfu/solaris-dev2dev
___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


[Matplotlib-users] How to blank an area of the canvas?

2010-02-12 Thread Brendan Barnwell
I'm trying to find the quickest way to erase a rectangular area of 
the figure canvas.  I tried using canvas.restore_region with the 
optional bbox argument, but there seems to be some mismatch between 
the measurement units of the saved buffer object and the currently 
shown data.  For instance, if I have a Text object on my plot, I tried 
this:

bbox = g.text.get_window_extent()
canvas.restore_region(background, bbox)

. . . but it does not correctly block out the text.  (The restored 
rectangle from the background appears elsewhere on the axes.)  How can 
I convert the buffer coordinates to the coordinates of the the 
displayed plot?

I also tried creating a patch with the same bounds as the text bbox 
and adding it to the axes, but this seems to have no effect.  Do I 
have to do something besides ax.draw_artist(mypatch) to get it to draw?

This is part of the same thing I posted about a few days ago with 
trying to do an animation with many moving parts.  Are there any 
examples of animations which do not involve restoring the entire 
background with each draw, but rather individually erasing individual 
elements in the plot and redrawing them elsewhere?  That's what I'm 
trying to do here.

Thanks,
-- 
Brendan Barnwell
Do not follow where the path may lead.  Go, instead, where there is 
no path, and leave a trail.
--author unknown

--
SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
http://p.sf.net/sfu/solaris-dev2dev
___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users