[R] Getting plot axes where they should be!
Marc Schwartz
marc_schwartz at comcast.net
Mon Jul 21 14:25:32 CEST 2008
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
More information about the R-help
mailing list