Deepayan Sarkar said the following on 4/11/2007 1:55 PM:
On 4/11/07, Sundar Dorai-Raj <[EMAIL PROTECTED]> wrote:

Seems like you may get a workaround (albeit kludgey) by using
?print.trellis. Here's another example:

library(lattice)
z <- expand.grid(x = 1:10, p = 1:5, r = 1:10)
z$y <- rnorm(nrow(z))
z$p <- factor(z$p, levels = c(1, 5, 2, 4, 3))
bot <- xyplot(y ~ x | p, z, groups = r,
               layout = c(2, 2), type = "l",
               scales = list(alternating = 1),
               subset = p != 3)
top <- xyplot(y ~ x | p, z, groups = r,
               type = "l", xlab = "",
               scales = list(alternating = 2),
               subset = p == 3)

print(bot, c(0, 0, 1, 11/16))
print(top, c(1/5, 7/12, 4/5, 1), newpage = FALSE)

Here's another hack (thanks to Sundar for the reproducible example):



library(grid)

## this is a safer version of current.panel.limits()

current.limits <-
   function ()
{
   xlim <- convertX(unit(c(0, 1), "npc"), "native", valueOnly = TRUE)
   ylim <- convertY(unit(c(0, 1), "npc"), "native", valueOnly = TRUE)
   if (any(!is.finite(xlim))) xlim <- c(0, 1)
   if (any(!is.finite(ylim))) ylim <- c(0, 1)
   list(xlim = xlim, ylim = ylim)
}

## this calls 'fun' after moving its viewport if panel.number() == 5

callAfterMoving <-
   function(fun, border = TRUE, move.x = 1, ...)
{
   if (panel.number() == 5) {
       fun(...)
       if (border) grid.rect()
   }
   else {
       cpl <- current.limits()
       pushViewport(viewport(x = move.x,
                             width = unit(1, "npc"),
                             xscale = cpl$xlim,
                             yscale = cpl$ylim,
                             clip = "off"))
       fun(...)
       if (border) grid.rect()
       upViewport()
   }
}


## this almost works, except for the axes on the left, because in the
## context in which it is drawn (the strip on the left, invisible in
## this example), information about how much to move right is not
## available.


xyplot(y ~ x | p, z, groups = r,
      layout = c(2, 3), type = "l",
      par.settings =
      list(axis.line = list(col = "transparent"),
           strip.border = list(col = "transparent")),
      panel = function(...) {
          callAfterMoving(panel.xyplot, ...)
      },
      strip = function(...) {
          callAfterMoving(strip.default, ...)
      },
      axis = function(..., line.col) {
          callAfterMoving(axis.default,
                          border = FALSE,
                          line.col = 'black',
                          ...)
      })


## one way to bail out is simply not draw the left axes.  It can also be
## added back explicitly by adding a call to panel.axis inside the
## panel function (see below)


xyplot(y ~ x | p, z, groups = r,
      layout = c(2, 3), type = "l",
      par.settings =
      list(axis.line = list(col = "transparent"),
           strip.border = list(col = "transparent")),
      panel = function(...) {
          callAfterMoving(panel.xyplot, ...)
      },
      strip = function(...) {
          callAfterMoving(strip.default, ...)
      },
      axis = function(..., line.col, side) {
          if (side != "left" || panel.number() != 5) {
              callAfterMoving(axis.default,
                              border = FALSE,
                              line.col = 'black',
                              side = side,
                              ...)
          }
      })


## panel function with axes on the left:

panel.leftaxes <- function(...)
{
   if (panel.number() == 5)
      panel.axis("left", outside = TRUE,
                  line.col = "black")
   panel.xyplot(...)
}


xyplot(y ~ x | p, z, groups = r,
      layout = c(2, 3), type = "l",
      par.settings =
      list(axis.line = list(col = "transparent"),
           strip.border = list(col = "transparent")),
      panel = function(...) {
          callAfterMoving(panel.leftaxes, ...)
      },
      strip = function(...) {
          callAfterMoving(strip.default, ...)
      },
      axis = function(..., line.col, side) {
          if (side != "left" || panel.number() != 5) {
              callAfterMoving(axis.default,
                              border = FALSE,
                              line.col = 'black',
                              side = side,
                              ...)
          }
      })

-Deepayan

Hi, Deepayan,

See the attached image for what your code produced. Not sure if this is what you intended.

Thanks,

--sundar

> sessionInfo()
R version 2.4.1 (2006-12-18)
i386-pc-mingw32

locale:
LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252

attached base packages:
[1] "grid"      "stats"     "graphics"  "grDevices" "utils"     "datasets"
[7] "methods"   "base"

other attached packages:
  lattice
"0.14-17"

PNG image

______________________________________________
R-help@stat.math.ethz.ch 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