On Fri, Aug 12, 2011 at 12:15 PM, Fredrik Karlsson <dargo...@gmail.com> wrote:
> Hi,
>
> I need a custom axis function for a plot, but it seems
> that current.panel.limits() sometimes returns NaN limits for the plot, which
> it much harder to calculate anything sensible.
> An illustration:
>
> Given this axis function:
>
>
> vs.axis <- function(...){
>   xlim <- current.panel.limits()$xlim
>   ylim <- current.panel.limits()$ylim
>
>   # Debug code
>   print(list(ylim=ylim,xlim=xlim))
>
>   xat <- pretty(seq(xlim[1],xlim[2],100),n=5)
>   yat <- pretty(seq(ylim[1],ylim[2],100),n=4)
>   xlab <- sub("-","",as.character(xat))
>   ylab <- sub("-","",as.character(yat))
>   panel.axis(side="top",at=xat,labels=xlab)
>   panel.axis(side="right",at=yat,labels=ylab)
> }
>
> and the attached data set, I get this output:

(The attachment didn't come through.)

>> xyplot(F1 ~F2,data=pb,axis=vs.axis)
> $ylim
> [1] NaN NaN
>
> $xlim
> [1]  346.5 3823.5
>
> Error in if (del == 0 && to == 0) return(to) :
>  missing value where TRUE/FALSE needed
>
> What's wrong? Is there a more robust way of getting the x- and y- limits?

You are doing the equivalent of

library(grid)
pushViewport(viewport(0.5, 0.5, width = 0.8, height = 0, xscale = c(0, 10)))
current.panel.limits()

(Note the height=0).

The axis function is called four times, once for each side. On the top
and left sides, it is actually called with the strip viewports active,
because the axis annotation goes outside the strip, not the panel. In
your case there are no strips, which basically mean a 0-height strip.
Your code will work (although will not give what you want) if you try
something like

xyplot(rnorm(10) ~ 1:10 | gl(1, 10), axis=vs.axis,
       strip = TRUE, strip.left = TRUE)

In real applications of custom axis functions, one usually writes code
conditioned on the value of the 'side' argument.

-Deepayan

______________________________________________
R-help@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.

Reply via email to