auto-rotating text and plotyy

Hi,

Attached are two patch sets for you to review and comment on. I am not
intending for these to go in this release.

One is the beginning of a patch set that lets you choose whether text
rotation angle is with respect to screen or axes coordinates. The idea
is that you might want text that is properly rotated with respect to
some object in a plot (e.g., contours), as opposed to being at some
particular angle with respect to screen coordinates. Along the way I
added a method to transforms.py that transforms angles at a location.
The method included is generic and not at all optimized for simple
linear transforms, but it works fairly well. This transform might be
useful for other functions (e.g., quiver?).

This patch basically works. For example, try the following:

plot(arange(5))
th = text(3,3,'abcd',rotation=45,rotationscreen=False)
th2 = text(2,2,'ABCD',rotation=45)

and then try changing the size of your plot window. 'abcd' doesn't
rotate with respect to the line as the window changes size, but 'ABCD'
does. There are still some imperfections - the text seems to move above
or below the line - I am not sure why this is. Also, I have no idea
whether I should be using unitless (self._x,_y) or unitful coordinates
(self.convert_(x|y)units) in the transformations. Perhaps someone can
enlighten me. It doesn't really matter until one tries non-linear
transformations (aka basemap).

I also haven't tried to integrate this into TextWithDash. I imagine it
can be done, but I wasn't sure it was worth the effort since
TextWithDash is mostly used for axes ticks I believe. I am thinking of
just forcing rotationscreen to True for this class. Comments?

Once these issues are worked out, I would integrate this into contour.py
so that windows can be resized without affecting label rotation.

The second patch is to pyplot.py to create a plotyy function. This is
like a matlab function of the same name that puts two curves with
different y ranges on the same x axis. It basically wraps the
two_scales.py demo functionality with a bit of extra stuff. I had to
use a real hack to change the colors of the y axes. Perhaps someone can
think of a better way or perhaps this sub-function should be moved out
of plotyy so it can be reused. Also, I couldn't find a way to color the
actual y-axis - i.e. the vertical line that is the y-axis. Is there an
easy way to do this?

Cheers,
David

text_rotation.patch (5.59 KB)

plotyy.patch (2.43 KB)

···

--
**********************************
David M. Kaplan
Charge de Recherche 1
Institut de Recherche pour le Developpement
Centre de Recherche Halieutique Mediterraneenne et Tropicale
av. Jean Monnet
B.P. 171
34203 Sete cedex
France

Phone: +33 (0)4 99 57 32 27
Fax: +33 (0)4 99 57 32 95
http://www.ur097.ird.fr/team/dkaplan/index.html
**********************************

David Kaplan wrote:

The second patch is to pyplot.py to create a plotyy function. This is
like a matlab function of the same name that puts two curves with
different y ranges on the same x axis. It basically wraps the
two_scales.py demo functionality with a bit of extra stuff. I had to
use a real hack to change the colors of the y axes. Perhaps someone can
think of a better way or perhaps this sub-function should be moved out
of plotyy so it can be reused. Also, I couldn't find a way to color the
actual y-axis - i.e. the vertical line that is the y-axis. Is there an
easy way to do this?

Do you have an example of how to use this (or at least what the results look like)? I'm having trouble seeing how this differs from twinx.

Ryan

···

--
Ryan May
Graduate Research Assistant
School of Meteorology
University of Oklahoma

Hi,

Sorry I didn't respond to this immediately - I have had my mind on other
things. plotyy is basically a wrapper around twinx that provides a bit
of extra/built-in functionality. The idea is that you have two curves
with similar x values, but different y that you want to plot together.
It plots them both using twinx, but to help with visualisation, it
changes the color of each curve and associated axis so that they are
easy to distinguish (e.g., left blue, right green). This is also
similar to a matlab function of the same name, so it helps us matlab
converts out.

An example of using this function might be:

x = linspace(0,pi,20)
y = sin(x)
x2 = linspace(0.1,pi-0.1,20)
y2 = cos(x2)

axs,h1,h2=plotyy(x,y,x2,y2)

axs is a list with [ax1,ax2]. As is evident from the code itself, there
isn't too much beyond what twinx already does, but this code aids matlab
compatibility and also the recursive handle property change is useful.
But this recursive code could be extricated to provide a general
setp_recursive function that would change a property on an object and
all its children (that have that property) if that is of interest.

Cheers,
David

···

On Fri, 2008-07-25 at 15:00 -0400, Ryan May wrote:

David Kaplan wrote:
> The second patch is to pyplot.py to create a plotyy function. This is
> like a matlab function of the same name that puts two curves with
> different y ranges on the same x axis. It basically wraps the
> two_scales.py demo functionality with a bit of extra stuff. I had to
> use a real hack to change the colors of the y axes. Perhaps someone can
> think of a better way or perhaps this sub-function should be moved out
> of plotyy so it can be reused. Also, I couldn't find a way to color the
> actual y-axis - i.e. the vertical line that is the y-axis. Is there an
> easy way to do this?

Do you have an example of how to use this (or at least what the results
look like)? I'm having trouble seeing how this differs from twinx.

Ryan

--
**********************************
David M. Kaplan
Charge de Recherche 1
Institut de Recherche pour le Developpement
Centre de Recherche Halieutique Mediterraneenne et Tropicale
av. Jean Monnet
B.P. 171
34203 Sete cedex
France

Phone: +33 (0)4 99 57 32 27
Fax: +33 (0)4 99 57 32 95
http://www.ur097.ird.fr/team/dkaplan/index.html
**********************************