\name{combineLimits}
\alias{combineLimits}
\title{Combine axis limits across margins}
\description{

  Modifies a \code{"trellis"} object with \code{"free"} scales so that
  panel limits are extended to be the same across selected conditioning
  variables (typically rows and columns).

}
\usage{
combineLimits(x, margin.x = 2L, margin.y = 1L,
              extend = TRUE, adjust.labels = TRUE)
}

\arguments{
  \item{x}{ An object of class \code{"trellis"}. }
  \item{margin.x}{
    Integer vector specifying which conditioning variables to combine
    the x-axis limits over.  Defaults to the second conditioning
    variable (rows in the default layout); that is, the limit of each
    packet is extended to include the limits of all other packets
    obtained by varying the level of the second conditioning variable
    (row).  More than one variable can be specified; for example,
    \code{margin.x = c(1, 2)} would ensure that limits are extended to
    include all levels in both the first and second conditioning
    variables.  In case there is a third conditioning variable, this
    would have the effect of per-page x-axis limits with the default
    layout.
  }
  \item{margin.y}{
    Integer vector specifying which conditioning variables to combine
    the x-axis limits over.  Similar to \code{margin.x}, but defaults to
    the first conditioning variable (columns in the default layout).
  }
  \item{extend}{
    Logical flag indicating whether the limits should be extended after
    being combined.  Usually a good idea.
  }
  \item{adjust.labels}{
    Logical flag indicating whether labels should be removed from all
    but the boundaries.  This may give misleading plots with non-default
    layouts.
  }
}

\details{

  \code{combineLimits} is useful mainly for plots with two conditioning
  variables with the default layout (columns and rows correspond to the
  first and second conditioning variables), when per-row and per-column
  limits are desired.

  The lattice approach does not tie levels of the conditioning variables
  to the plot layout, so it is possible that all panels in a row (or
  column) do not represent the same level.  It should be noted that
  \code{combineLimits} actually combines limits across levels, and not
  across rows and columns.  Results are likely to be misleading unless
  the default layout is used.

}

\note{

  Does not work for all \code{"trellis"} objects.  In particular,
  log-scales do not yet work.  Fancy layouts with \code{skip}-ped panels
  and unusual packet-to-panel mappings will probably also not work.

}

\value{

  An object of class \code{"trellis"}; essentially the same as \code{x},
  but with certain properties modified.

}
\author{ Deepayan Sarkar }

\seealso{ \code{\link[lattice]{Lattice}}, \code{\link[lattice]{xyplot}} }

\examples{

data(Cars93, package = "MASS")

## FIXME: log scales don't yet work

pcars <- 
    xyplot(Price ~ EngineSize | reorder(AirBags, Price) + Cylinders,
           data = Cars93, 
           subset = Cylinders != "rotary" & Cylinders != "5", 
           scales = list(relation = "free",
                         y = list(log = FALSE, tick.number = 3, rot = 0)),
           xlab = "Engine Size (litres)", 
           ylab = "Average Price (1000 USD)",
           as.table = TRUE) 

combineLimits(pcars)

useOuterStrips(combineLimits(update(pcars, grid = TRUE),
                             margin.x = c(1, 2), adjust.labels = FALSE))

useOuterStrips(combineLimits(update(pcars, grid = TRUE)))

}

\keyword{dplot}
