From: Anthony F. <ant...@gm...> - 2008-03-06 01:57:18
|
I'm stumped. I would like to 'watermark' a plot. That is, display an image 'under' several lines. I would like this watermark to be static and not change location, shape, or size while allowing for the lines to be zoomed and panned. I'm doing this all using the API (not pylab). I've tried using figure.figimage, but that only draws the watermark 'outside' the plot area. Fair enough. I've tried creating an axes object on top of my existing axes (actually my 'existing axes' is already four axes objects stacked on top of each other with some sharex magic happening) and using axes.imshow on that. While I do get the image, it doesn't display or behave as expected. Essentially the image displays in front of my first axes object, and no amount of twiddling with axes.set_zorder was affecting it. Things plotted on the subsequent axes plot on top of the image. This reflects the axes creation sequence, but zorder doesn't seem to be doing anything. I've also explicitly set the zorder of the image, but didn't see any effect there either. Adding to my confusion, the 'watermark' axes' size is wrong. When I create the axes object, I set the size using rect=axes1.get_position() in the figure.add_axes() call. The other 'real' axes use the same thing, but manage to get the size correct. The watermark axes is essentially the size of my image. Does anyone know what I've missed? I've hit the wiki, I've exercised my Google-fu, but I don't see any examples of what I'm trying to do. I'm using mpl 0.90.0 at the moment ... but if pressed we can upgrade to a newer release (our reason for not keeping up with releases is the old 'not broken, don't fix'). At the moment I'm not too worried about keeping the axes static while panning and zooming ... I've already customized backend_bases and I can skip the watermark axes when the zoom and pan events are processed. But it sure would be nice to be able to display this image (and later, some static text boxes that don't move with the plots too) in the appropriate location. Thanks for any suggestions, Anthony. |
From: <Jou...@xt...> - 2008-03-06 10:01:13
|
"Anthony Floyd" <ant...@gm...> writes: > I would like to 'watermark' a plot. That is, display an image 'under' > several lines. [...] I've tried using figure.figimage, but that only > draws the watermark 'outside' the plot area. Fair enough. The background of the axes object is called a "frame", and you want to not draw it at all (pass frameon=False to add_axes) or make it translucent: fig=figure(...) fig.figimage(...) ax=fig.add_subplot(...) ax.get_frame().set_alpha(0.5) -- Jouni K. Seppänen http://www.iki.fi/jks |
From: Anthony F. <ant...@gm...> - 2008-03-13 17:26:07
|
On Thu, Mar 6, 2008 at 3:00 AM, <Jou...@xt...> wrote: > "Anthony Floyd" <ant...@gm...> writes: > > > I would like to 'watermark' a plot. That is, display an image 'under' > > several lines. [...] I've tried using figure.figimage, but that only > > > draws the watermark 'outside' the plot area. Fair enough. > > The background of the axes object is called a "frame", and you want to > not draw it at all (pass frameon=False to add_axes) or make it > translucent: > > fig=figure(...) > fig.figimage(...) > ax=fig.add_subplot(...) > ax.get_frame().set_alpha(0.5) > Thanks! That essentially works as expected. Anthony. |
From: Anthony F. <ant...@gm...> - 2008-03-14 13:44:38
|
On Thu, Mar 6, 2008 at 3:00 AM, <Jou...@xt...> wrote: > "Anthony Floyd" <ant...@gm...> writes: > > > I would like to 'watermark' a plot. That is, display an image 'under' > > several lines. [...] I've tried using figure.figimage, but that only > > > draws the watermark 'outside' the plot area. Fair enough. > > The background of the axes object is called a "frame", and you want to > not draw it at all (pass frameon=False to add_axes) or make it > translucent: > > fig=figure(...) > fig.figimage(...) > ax=fig.add_subplot(...) > ax.get_frame().set_alpha(0.5) For the archives, I found that the best way to do this was to set the frame alphas to 0.0, and to draw the watermark directly in the canvas' .draw() routine. This allows for smooth panning and resizing. Otherwise, when trying to redraw the watermark in response to an EVT_SIZE (I'm using wx), two problems would come up. 1) The redraw routine would happen before the frame/panel/canvas/figure 'knew' what its new size was, causing some weird 'jumping around' artefacts, and 2) There'd be some serious flicker because the plot would be drawn then the watermark would be drawn. A> |