Re: [R] Getting plot axes where they should be!

From: Ted Harding <Ted.Harding_at_manchester.ac.uk>
Date: Mon, 21 Jul 2008 13:52:56 +0100 (BST)


On 21-Jul-08 12:25:32, Marc Schwartz wrote:

> on 07/21/2008 07:13 AM (Ted Harding) wrote:

>> Hi Folks,
>> I've been digging for the solution to this for several
>> hours now. If there is a solution, it must be one of the
>> worst "needle-in-a-haystack" examples in R documentation!
>>
>> Essentially, I want to make an x-y plot in which the
>> X-axis really is the X-axis (i.e. its vertical position
>> is at y=0), and the Y-axis really is the Y-axis (i.e.
>> its horizontal position is at x=0). Discussion, with
>> toy examples, below.
>>
>> I have sort-of solved this (as stated) for one special
>> case, after a depth-4 search through
>>
>> ?plot --> ?plot.default --> ?par --> ?axis
>>
>> which finally led me to the parameter "pos" to axis():
>>
>> ?axis
>> pos: the coordinate at which the axis line is to be drawn:
>> if not 'NA' this overrides the values of both 'line' and 'mgp[3]'.
>>
>> Hence, instead of
>>
>> plot(c(0.5,2.5),c(0.5,2.5),xlim=c(0,3),ylim=c(0,3),
>> frame.plot=FALSE)
>>
>> (where the axes do not meet at the origin (0,0)), I can do
>>
>> plot(c(0.5,2.5),c(0.5,2.5),xlim=c(0,3),ylim=c(0,3),
>> frame.plot=FALSE,pos=0)
>>
>> which is *exactly* what I want in this case.
> 
> Ted, try this:
> 
> plot(c(0.5,2.5), c(0.5,2.5), xlim=c(0,3), ylim=c(0,3),
>       xaxs = "i", yaxs = "i")
> 
> or perhaps this:
> 
> plot(c(0.5,2.5), c(0.5,2.5), xlim=c(0,3), ylim=c(0,3),
>       xaxs = "i", yaxs = "i", axes = FALSE, frame.plot = FALSE)
> 
> axis(1)
> axis(2)
> 
> 

>> But now I want to do the same, where instead of plotting the
>> two points (0.5,0.5), (2.5,2.5) I want to plot (0.5,2.5), (2.5,4.5).
>>
>> Provided I keep the xlim and ylim to both have lower value 0,
>> a similar solution again works fine:
>>
>> plot(c(0.5,2.5),c(2.5,4.5),xlim=c(0,3),ylim=c(0,5),
>> frame.plot=FALSE,pos=0)
> 
> Same thing here:
> 
> plot(c(0.5,2.5), c(2.5,4.5), xlim=c(0,3), ylim=c(0,5),
>       xaxs = "i", yaxs = "i")
> 
> 

>> But, in this case, what I *really* want is to limit the Y range
>> to the "relevant" bit: ylim=c(2,5) -- I don't want to have a lot
>> of empty space below the points. So I want a Y-axis running from
>> y=2 to y=5, and X-axis as before from x=0 to x=3, and I want these
>> two axes to meet at (x=0,y=2). But how?
> 
> plot(c(0.5,2.5), c(2.5,4.5), xlim=c(0,3), ylim=c(2,5),
>       xaxs = "i", yaxs = "i")
> 

>> By analogy to the above, I need to set a "pos=0" for the X-axis,
>> and a "pos=2" for the y-axis. And I have not been able to discover
>> how to do this.
>>
>> With thanks,
>> Ted.
> 
> See ?par and take note of 'xaxs' and 'yaxs', where it is noted that the
> default 'r' extends the axes by +/- 4% of the data range. Using 'i' 
> gives you axes with the exact range of the data and/or the 'xlim' and 
> 'ylim' settings.
> 
> HTH,
> Marc Schwartz

Thanks, Marc! Those hints solved it for me in the end.

In fact, a variant on your suggestions is exactly what I want (in the third example):

  plot(c(0.5,2.5), c(2.5,4.5), xlim=c(0,3), ylim=c(2,5),

       xaxs = "i", yaxs = "i",frame.plot=FALSE)

I have to say (admit? confess?) that I had read through the help on xaxs and yaxs in ?par, without interpreting it in terms of how the axis itself is positioned -- as written, it rather seems to describe how the annotations are computed and (in the case where xlim/ylim is not given) how long the axis should be. In other words, what are the properties of the axis itself (including its labels) rather than how it is offset perpendicular to itself (which is the issue I was trying to resolve). Re-reading it now that I have your solution, I still find that this interpretation is not explicit, and needs to be guessed.

Thanks again,
Ted.



E-Mail: (Ted Harding) <Ted.Harding_at_manchester.ac.uk> Fax-to-email: +44 (0)870 094 0861
Date: 21-Jul-08                                       Time: 13:52:53
------------------------------ XFMail ------------------------------

______________________________________________
R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Mon 21 Jul 2008 - 13:01:16 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Mon 21 Jul 2008 - 13:32:01 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive