Skip to content

scaling with relative units in plots or retrieving axes limits in plots

5 messages · Jannis, Ivan Calandra, Greg Snow

#
Dears,


a way to define x and y positions in plots in relative numbers (e.g in fractions  between 0 and 1 referring to relative positions inside the plot region) would really help me. One example I would need this to would be to add text via text() to a plot always at a defined spot, e.g the upper left corner. Until now I always determined maximum x and y values and used those, but defining relative positions straight away would be much easier. Possible solutions:

1. Predefined function
Is there anything available that lets me run (for example):

text(0.5,0.5,'middle')

which always puts text on these relative points?



2. Create my own function
It would be straightforward to create my own function that translates the relative number to the axes values in the actual plot, so that 

text(my.function(0.5,0.5),'middle')

would do what I want. For this I would need to be able to somehow retrieve the axis limits for x and y axes. Is there any way I could do this after having called plot()?



Thanks for your help!


Jannis
#
Hi,

For 2., I don't know if it's possible to retrieve the axis limits, but 
you can surely specify them in your call to plot (with arguments xlim 
and ylim).
That's a cheap solution and others probably have better ones.

Ivan

Le 5/18/2010 16:23, Jannis a ?crit :

  
    
#
Thanks for the replies! If anybody  encounters a similar problem, the function that now does what I wanted is attached below.


Best
Jannis



trnsf.coords = function(array_x,array_y)

# This function transfers relative coordinates between 0 and 1 for two arrays with x
# and y values into the coordinate system of the current plot.
    
{
    plot_extremes=par()$usr
    x_min=plot_extremes[1]
    x_max=plot_extremes[2]
    y_min=plot_extremes[3]
    y_max=plot_extremes[4]

    x_trans=x_min+(array_x*x_max-x_min)
    y_trans=y_min+(array_y*y_max-y_min)
    output=list(x=x_trans,y=y_trans)
    return(output)

}

--- Jannis <bt_jannis at yahoo.de> schrieb am Di, 18.5.2010:
#
Look at the grconvertX and grconvertY functions for a built in solution with much more flexibility.
#
Sorry for the spamming, but there was a slight mistake in my function. Even though something similar most probably exists, a correct version is attached below, just in case :-)

trnsf.coords = function(x=c(),y=c())

# This function transfers relative coordinates between 0 and 1 for two arrays with x
# and y values into the coordinate system of the current plot. 
{
    plot_extremes=par()$usr
    x_min=plot_extremes[1]
    x_max=plot_extremes[2]
    y_min=plot_extremes[3]
    y_max=plot_extremes[4]

    x_trans=x_min+(x*(x_max-x_min))
    y_trans=y_min+(y*(y_max-y_min))
    if (length(y)==0)
    {
        output=list(x=x_trans)
    } else if (length(x) ==0) {
        output=list(y=y_trans)
    } else {    
    output=list(x=x_trans,y=y_trans)
    }
    return(output)

}


--- Jannis <bt_jannis at yahoo.de> schrieb am Di, 18.5.2010: