[R] Controlling text and strip arrangement in xyplot

Deepayan Sarkar deepayan.sarkar at gmail.com
Tue Jun 19 20:12:05 CEST 2007


On 6/19/07, Juan Pablo Lewinger <lewinger at usc.edu> wrote:
> I've searched the archives and read the xyplot help but can't figure
> out the 2 lattice questions below?
>
> Consider:
>
> library(lattice)
> DF <- data.frame(x=rnorm(20), y=rnorm(20), g1=rep(letters[1:2], 10),
>                   g2=rep(LETTERS[1:2], each=10),
> g3=rep(rep(letters[3:4],each=5),2))
>
> xyplot(y ~ x | g1 + g2, groups=g3, data=DF)
>
> 1) Is there a way to get one strip per row and column of panels as
> below instead of the default?
>
>
>         _|__a__|__b__|
>          |
>        B
>          |
>         --
>          |
>        A
>          |

This has been discussed on the list before (if I remember correctly), and I
have been meaning to add something to the latticeExtra package.  An
implementation would look something like this (beware of line wrapping):


useOuterStrips <-
    function(x,
             strip = strip.default,
             strip.left = strip.custom(horizontal = FALSE))
{
    dimx <- dim(x)
    stopifnot(inherits(x, "trellis"))
    stopifnot(length(dimx) == 2)
    opar <- if (is.null(x$par.settings)) list() else x$par.settings
    par.settings <-
        modifyList(opar,
                   list(layout.heights =
                        list(strip = c(rep(0, dimx[2]-1), 1)),
                        layout.widths =
			list(strip.left = c(1, rep(0, dimx[1]-1)))))
    update(x,
           par.settings = par.settings,
           strip = function(which.given, which.panel, ...) {
               if (which.given == 1)
                   strip(which.given = 1,
                         which.panel = which.panel[1],
                         ...)
           },
           strip.left = function(which.given, which.panel, ...) {
               if (which.given == 2)
                   strip.left(which.given = 1,
                              which.panel = which.panel[2],
                              ...)
           },
           par.strip.text = list(lines = 0.5),
           layout = dimx)
}


The function acts on a "trellis" object and returns an updated one, so
for your example, it would work like:

useOuterStrips(xyplot(y ~ x | g1 + g2, groups=g3, data=DF))


> 2) How do I control the text of the strips so that for instance
> instead of "a" and "b" it reads"g1=alpha", "g1=beta" where "alpha"
> and "beta" stand for the corresponding greek symbols? (my difficulty
> here is not with the plotmath symbols but with controlling the text
> of the strips directly from the call to xyplot and not by renaming
> the levels of g1)

Generally speaking, you need to write your own strip function.  The
default (strip.default) has some useful arguments that modify its
behaviour, and in particular 'factor.levels' might do what you
want.  If you are going to do this in conjunction with (1), life will
actually be simpler and you can get away with using strip.custom():


useOuterStrips(xyplot(y ~ x | g1 + g2, groups=g3, data=DF),
               strip =
               strip.custom(factor.levels =
                            expression(g[1]==alpha, g[1]==beta)),
               strip.left =
               strip.custom(horizontal = FALSE,
                            factor.levels =
                            expression(g[2]==gamma, g[2]==delta)))


Otherwise, you will really have to write a proper strip function that
calls strip.default() with different values of 'factor.levels'
depending on the value of 'which.given'.

Note also the 'strip.names' and 'sep' argument of strip.default(),
which might be more in line with what you want to do.

-Deepayan



More information about the R-help mailing list