[R] lattice custom axis function -- right side margins

Timothy W. Hilton hilton at meteo.psu.edu
Thu Mar 3 18:52:31 CET 2011


Dear R help list,

I have a plot with two different vertical scales that I want to display
on either side of the plot.  It's quite similar to the
Fahrenheit-Centigrade example in the examples section of the
documentation for axis.default.  

The right-side axis is clipped off, though, and I haven't been able to
figure out anything with viewport() and clipping or trellis.par.set to
fix that...  Any help greatly appreciated!  Minimal example below.

I would also like to add a label to the right-side vertical axis similar
to the "sill..." label on the left.  Bonus points if anyone can throw
that in...

Many thanks,
Tim

--

Timothy W. Hilton
PhD Candidate, Department of Meteorology
The Pennsylvania State University
503 Walker Building, University Park, PA   16802
hilton at meteo.psu.edu

--------------------------------------------------
code to produce the plot with right-side labels clipped off



example_data <-
structure(list(year = structure(c(4L, 2L, 2L, 7L, 2L, 2L, 4L, 
2L, 2L, 2L, 2L, 2L, 2L, 1L, 4L, 4L, 2L, 7L, 3L, 2L, 5L), .Label = c("2000", 
"2001", "2002", "2003", "2004", "2005", "2006"), class = "factor"), 
    var = structure(c(2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 2L, 
    2L, 2L, 2L, 3L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("NEE.model", 
    "NEE.model.res", "NEE.obs"), class = "factor"), par_set = structure(c(6L, 
    1L, 3L, 6L, 7L, 2L, 7L, 5L, 1L, 6L, 3L, 4L, 1L, 1L, 4L, 1L, 
    7L, 5L, 9L, 9L, 9L), .Label = c("all.all", "all.ann", "all.mon", 
    "pft.all", "pft.ann", "pft.mon", "site.all", "site.ann", 
    "site.mon"), class = "factor"), sigmasq = c(11430.2595455547, 
    12118.5387166954, 12982.4722525337, 16366.3059675243, 16650.2206047512, 
    19730.2121989498, 19958.3416187217, 20491.4117984889, 20647.8829877428, 
    21389.0300281264, 21413.7674128747, 21445.7255788782, 22002.8026436862, 
    22042.9802472953, 22201.0461487030, 22340.9959465200, 24782.8974616218, 
    27207.1283451608, 59450.6758048182, 94725.119215293, 694716.769010273
    )), .Names = c("year", "var", "par_set", "sigmasq"), row.names = c(94L, 
8L, 20L, 43L, 44L, 68L, 100L, 86L, 2L, 92L, 74L, 80L, 62L, 1L, 
82L, 64L, 98L, 37L, 57L, 56L, 59L), class = "data.frame")

sigsq2sig <- function(sigmasq) sqrt(2 * sigmasq)
sig2sigsq <- function(sig) 0.5 * (sig)^2

# axis method to add a std deviation axis to the right side of a sill plot 
axis.sigmasq <- function(side, ...) {
  switch(side,
         left = {
           ylim <- current.panel.limits()$ylim
           pretty_sigmasq <- pretty(ylim)
           panel.axis(side = side, outside = TRUE,
                      at = pretty_sigmasq, labels = pretty_sigmasq)
         },
         right = {
           ylim <- current.panel.limits()$ylim
           pretty_sigmasq <- pretty(ylim)
           pos_sigmasq <- pretty_sigmasq[pretty_sigmasq >= 0]
           pretty_sigma <- pretty(sigsq2sig(pos_sigmasq))
           panel.axis(side = side, outside = TRUE,
                      at = sig2sigsq(pretty_sigma),
                      labels = pretty_sigma)
         },
         axis.default(side = side, ...))
}

my_plot <- function(best.fits, ...) {

  y.main.label <- expression(sill~group("[", group("(", mu*mol~s^-1~m^-2 ,")")^2, "]"))
  #plot the parameter values, one per year
  plt <- xyplot(sigmasq~interaction(var, par_set),
                data=best.fits,
                groups=year,
                axis = axis.sigmasq,
                scales=list(x=list(rot=45)),
                xlab=list(label="NEE measure"),
                ylab=list(label=y.main.label),
                ...)
  return(plt)
}

print(my_plot(example_data))



More information about the R-help mailing list