blob: d64a6d41bb4708aeda0fb14a8853ba2530cc71c1 [file] [log] [blame]
# File src/library/stats/R/lag.plot.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1999-2012 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
## Function exists in S-plus
## Differences:
## 1) R has `type = "p"' argument
## Idea: use "b" for n <= 10, else "p" as default, allow "text" / "labels" !
## 2) R uses `main', not `head' {consistency!}
## 3) R has `oma' and `...' args
## 4) R has ask = par("ask") where S-plus has ask = FALSE,
## ....
lag.plot <- function(x, lags = 1, layout = NULL, set.lags = 1L:lags,
main = NULL, asp = 1,
diag = TRUE, diag.col = "gray", type = "p", oma = NULL,
ask = NULL, do.lines = (n <= 150), labels = do.lines, ...)
{
lAxis <- function(side , ..., mgp, xpd, panel, Mgp)
if(missing(Mgp)) axis(side, ..., xpd = NA)
else axis(side, ..., xpd = NA, mgp = Mgp)
xnam <- deparse(substitute(x))
is.mat <- !is.null(ncol(x))
nser <- ncol(x <- as.ts(as.matrix(x)))
n <- nrow(x)
if(missing(lags) && !missing(set.lags))
lags <- length(set.lags <- as.integer(set.lags))
tot.lags <- nser * lags
if(is.null(ask)) {
if (.Device == "null device") dev.new()
ask <-
if(is.null(layout)) par("ask") ## FALSE, since will have big layout
else (dev.interactive() && prod(layout) < tot.lags)
}
if(is.null(layout))
layout <-
if(prod(pmf <- par("mfrow")) >= tot.lags) pmf
else n2mfrow(tot.lags)
## Plotting
## avoid resetting mfrow and using outer margins for just one plot
mlayout <- any(layout > 1)
if(mlayout) {
dots <- list(...)
cex.main <- dots$cex.main
if(is.null(cex.main)) cex.main <- par("cex.main")
if(is.null(oma)) {
oma <- rep(2, 4)
if (!is.null(main)) oma[3L] <- oma[3L] + 3*cex.main
}
opar <- par(mfrow = layout,
mar = c(1.1, 1.1, 0.5, 0.5) + is.mat*c(0, 0.5, 0, 0.5),
oma = oma, ask = ask)
on.exit(par(opar))
}
nR <- layout[1L]
nC <- layout[2L]
ii <- jj <- 0 ## current row and column in the layout
for(i in 1L:nser) {
X <- x[,i]
xl <- range(X)
nam <- if(is.mat) dimnames(x)[[2L]][i] else xnam
newX <- is.mat
for (ll in set.lags) {
jj <- 1 + jj %% nC
if(jj == 1) # new row
ii <- 1 + ii %% nR
## plot.ts(x,y) *does* a lag plot -> text, ...
if(mlayout) {
plot(lag(X, ll), X, xlim = xl, ylim = xl, asp = asp,
xlab = paste("lag", ll), ylab = nam,
mgp = if(mlayout) c(0,0,0),
axes = FALSE, type = type,
xy.lines = do.lines, xy.labels = labels,
col.lab = if(newX) "red",
font.lab = if(newX) 2,
...)
box(...) # pass bty along
if (jj == 1 && ii %% 2 == 1 && !newX)
lAxis(2, ...)
if (ii == 1 && jj %% 2 == 1)
lAxis(3, ...)
do.4 <- (ii %% 2 == 0 && (jj == nC ||
## very last one:
(i == nser && ll == set.lags[lags])))
if (do.4) lAxis(4, ...)
if (jj %% 2 == 0 && ii == nR) lAxis(1, ...)
if(newX) {
newX <- FALSE
if(!do.4) lAxis(4, Mgp = c(0,.6,0), ...)
}
} else {
plot(lag(X, ll), X, xlim = xl, ylim = xl, asp = asp,
xlab = paste("lag", ll), ylab = nam,
type = type,
xy.lines = do.lines, xy.labels = labels,
main = main, ...)
}
if(diag) abline(c(0,1), lty = 2, col = diag.col)
if (mlayout && !is.null(main)) {
font.main <- dots$font.main
if(is.null(font.main)) font.main <- par("font.main")
if ((jj == nC && ii == nR) || ll == set.lags[lags])
mtext(main, 3, 3, outer = TRUE, at = 0.5,
cex = cex.main, font = font.main)
}
}
}
invisible(NULL)
}