Skip to content

xyplot: logarithmic y-axis

6 messages · RMan54, Deepayan Sarkar

#
This should be simple but I am struggling. I like to easily switch in xyplot
between a linear or logarithmic y-axis by setting a logical flag logY to
False or True. This switch changes the scales argument of xyplot. I found
out that the original two-dimentional data (Conc vs Time in my case) are
converted to log10(Conc) if log=TRUE in scales, but it appears that
functions like panel.curve need to provide the y values in log10 form (if
there is an automatic method, I would like to know). I therefore like to
pass on the value logY to my custom panel.curve function. How do I do that?
I think that the value of logY should go into xyplot that should pass it on
to the panel function and then to the panel.curve function.

Thanks, -Rene

logY=TRUE

# Custom panel.curve function
myCurve <-function(x, log) {
    f <- ...   #  calculate curve here
    if (log==TRUE) f <- log10(f)
    return(f)
}

xyplot(Conc ~ Time | Subj,
       groups=Dose,
       data = mydata,
       as.table=TRUE,
       scales=list(y=list(log=logY)),
       panel = function(...) {
           panel.abline(h=c(0, 50, 100, 150, 200, 250) ,
                      v=c(0,24,48,72,96), col.line="gray")
           panel.xyplot(...)
           panel.curve(myCurve, from=0, to=96, n=300))
           }
       )
#
On 12/15/06, RMan54 <RMan54 at cox.net> wrote:
It probably should, but doesn't.

-Deepayan
#
Please take no offence since none was intended. What I meant is that it
should be simple for me to know how to do this but it isn't because of my
inexperience. I  think that the lattice package is great.

However, how can I pass on my own varaibles through xyplot?

Thanks, -Rene
Deepayan Sarkar wrote:

  
    
#
On 12/15/06, RMan54 <RMan54 at cox.net> wrote:
I didn't mean to suggest that I was offended. I only agreed with you
that it would be nice if there were a way of knowing inside the panel
function whether a log scale is being used, and informing you that
there isn't.
Any arguments not recognized by xyplot will be passed to the panel function.

-Deepayan
#
I added logY as the last argument to xyplot and in my curve function. I got
the following error message:

Error in myCurve(x) : argument "log" is missing, with no default

myCurve <-function(x, log) {
    f <- ... # calculate curve here
    if (log==T) f <- log10(f)
    return(f)
}

logY=T
xyplot(Conc ~ Time | Subj,
       groups=Dose,
       data = mydata,
       scales=list(x=list(at=seq(0,96,24)), y=list(log=logY)),
       panel = function(...) {
           panel.abline(h=c(0, 50, 100, 150, 200, 250) ,
                      v=c(0,24,48,72,96), col.line="gray")
           panel.xyplot(...)
           panel.curve(myCurve, from=0, to=96, n=300, ..., log=logY)
           },
       logY
       )
Deepayan Sarkar wrote:

  
    
#
On 12/15/06, RMan54 <RMan54 at cox.net> wrote:
You need to learn more about (1) R functions and (2) R's scoping
rules. Your last argument (logY) is not doing what you think it's
doing (which doesn't really matter because of the scoping rules).

Your error is caused because in

panel.curve(myCurve, from=0, to=96, n=300, ..., log=logY)

the 'log' argument is not being passed to myCurve (nor is it supposed
to). However, you should be able to replace it by

panel.curve(myCurve(x, log = logY), from=0, to=96, n=300, ...)

-Deepayan