[R] xlab at top in xyplot()

Deepayan Sarkar deepayan.sarkar at gmail.com
Thu May 22 01:38:14 CEST 2008


On 5/21/08, Michael Kubovy <kubovy at virginia.edu> wrote:
> Dear R-helpers,
>
>  (1) How do I add a 'top' label symmetric with the 'bottom' label' in:
>
>  axis.td <-
>       function(side, ...)
>   {
>       ylim <- current.panel.limits()$ylim
>       switch(side,
>              bottom = {
>                  panel.axis(side = side, outside = TRUE, rot = 0,
>                             at = 1:3, labels = c(2.0, 3.5, 5.0))
>              },
>              top = {
>                  panel.axis(side = side, outside = TRUE, rot = 45,
>                             at = 1:3, labels = c(0.143, 0.250, 0.357))
>              },
>              axis.default(side = side, ...))
>   }
>
>  xyplot(1:3 ~ 1:3, type = 'b', axis = axis.td, xlab = 'bottom', ylab =
>  'left', aspect = 'xy')

No good way ('main' will be centered differently). I will consider
adding a new row for something like xlab.top (and a column for a
ylab.right).

>  (2) Is there a simpler way to create the two axes?

Simpler? Probably not. ?axis.default has this and another approach as
examples; in theory, the other method is better because it gives
lattice a chance to automatically allocate space for the labels, but
that doesn't happen yet in practice.

>  (3) A bit more complex:
>
>  df <- data.frame(x = rep(1:3, 3), y = 1:9, z = factor(rep(1:3, each =
>  3)))
>  xyplot(y ~ x | z, df, axis = axis.td, xlab = 'bottom', ylab = 'left',
>  layout = c(3, 1), aspect = 'xy', type = 'b')
>
>  Here I would like to have a different pair of top and bottom axes for
>  each panel (i.e., different labels at 1:3), and a different top and
>  bottom label.

You could use current.column() and current.row() inside axis.td().

The different bottom labels are easy: xlab = c("one", "two", "three"),
but labels on the top are not. Of course, you could add a label from
inside each axis.td call, and add some space for them manually.

-Deepayan



More information about the R-help mailing list