How to blank an area of the canvas?

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

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

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 <brenbarn@...1219...> wrote:

Brendan Barnwell wrote:

  I&#39;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&#39;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&#39;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

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