blob: 9c4a88a51b5a4b22fc53a764dc111fe88a1dfba7 [file] [log] [blame] [edit]
% File src/library/grDevices/man/n2mfrow.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2019 R Core Team
% Distributed under GPL 2 or later
\name{n2mfrow}
\alias{n2mfrow}
\title{Compute Default 'mfrow' From Number of Plots}
\description{
Easy setup for plotting multiple figures (in a rectangular layout) on
one page. This computes a sensible default for
\code{\link{par}(mfrow)}.
}
\usage{
n2mfrow(nr.plots, asp = 1)
}
\arguments{
\item{nr.plots}{integer; the number of plot figures you'll want to draw.}
\item{asp}{positive number; the target aspect ratio (columns / rows) in
the output. Was implicitly hardwired to \code{1}; because of that and
back compatibility, there is a somewhat discontinuous behavior when
varying \code{asp} around 1, for \code{nr.plots <= 12}.}
}
\value{
A length-two integer vector \code{(nr, nc)} giving the positive number of rows
and columns, fulfilling \code{nr * nc >= nr.plots}, and currently, for
\code{asp = 1}, \code{nr >= nc >= 1}.
}
\note{
Conceptually, this is a quadratic integer optimization problem, with
inequality constraints \eqn{nr >= 1}, \eqn{nc >= 1}, and
\eqn{nr.plots >= nr*nc} (and possibly \code{nr >= asp*nc}),
and \emph{two} objective functions which would have to be combined via a
tuning weight, say \eqn{w}, to, e.g.,
\eqn{(nr.plots - nr*nc) + w |nr/nc - asp|}.
The current algorithm is simple and not trying to solve one of these
optimization problems.
}
\author{Martin Maechler; suggestion of \code{asp} by Michael Chirico.}
\seealso{\code{\link{par}}, \code{\link{layout}}.}
\examples{
require(graphics)
n2mfrow(8) # 3 x 3
n <- 5 ; x <- seq(-2, 2, length.out = 51)
## suppose now that 'n' is not known {inside function}
op <- par(mfrow = n2mfrow(n))
for (j in 1:n)
plot(x, x^j, main = substitute(x^ exp, list(exp = j)), type = "l",
col = "blue")
sapply(1:14, n2mfrow)
sapply(1:14, n2mfrow, asp=16/9)
}
\keyword{dplot}
\keyword{utilities}