blob: 9f85d91248c36daa19752486810f6bb2102fef46 [file] [log] [blame]
# File src/library/stats/R/interaction.plot.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2013 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/
interaction.plot <-
function(x.factor, trace.factor, response, fun=mean,
type = c("l", "p", "b", "o", "c"), legend = TRUE,
trace.label=deparse(substitute(trace.factor)), fixed=FALSE,
xlab = deparse(substitute(x.factor)), ylab = ylabel,
ylim = range(cells, na.rm=TRUE),
lty = nc:1, col = 1, pch = c(1L:9, 0, letters),
xpd = NULL, leg.bg = par("bg"), leg.bty = "n",
xtick = FALSE, xaxt = par("xaxt"), axes = TRUE, ...)
{
ylabel <- paste(deparse(substitute(fun)), "of ",
deparse(substitute(response)))
type <- match.arg(type)
cells <- tapply(response, list(x.factor, trace.factor), fun)
nr <- nrow(cells); nc <- ncol(cells)
xvals <- 1L:nr
## See if the x.factor labels are a sensible scale
if(is.ordered(x.factor)) {
wn <- getOption("warn")
options(warn=-1)
xnm <- as.numeric(levels(x.factor))
options(warn=wn)
if(!anyNA(xnm)) xvals <- xnm
}
xlabs <- rownames(cells)
ylabs <- colnames(cells)
nch <- max(sapply(ylabs, nchar, type="width"))
if(is.null(xlabs)) xlabs <- as.character(xvals)
if(is.null(ylabs)) ylabs <- as.character(1L:nc)
xlim <- range(xvals)
xleg <- xlim[2L] + 0.05 * diff(xlim)
xlim <- xlim + c(-0.2/nr, if(legend) 0.2 + 0.02*nch else 0.2/nr) * diff(xlim)
dev.hold(); on.exit(dev.flush())
matplot(xvals, cells, ..., type = type, xlim = xlim, ylim = ylim,
xlab = xlab, ylab = ylab, axes = axes, xaxt = "n",
col = col, lty = lty, pch = pch)
if(axes && xaxt != "n") {
## swallow ... arguments intended for matplot():
axisInt <- function(x, main, sub, lwd, bg, log, asp, ...)
axis(1, x, ...)
mgp. <- par("mgp") ; if(!xtick) mgp.[2L] <- 0
axisInt(1, at = xvals, labels = xlabs, tick = xtick, mgp = mgp.,
xaxt = xaxt, ...)
}
if(legend) {
yrng <- diff(ylim)
yleg <- ylim[2L] - 0.1 * yrng
if(!is.null(xpd) || { xpd. <- par("xpd")
!is.na(xpd.) && !xpd. && (xpd <- TRUE)}) {
op <- par(xpd = xpd)
on.exit(par(op), add = TRUE)
}
text(xleg, ylim[2L] - 0.05 * yrng, paste(" ", trace.label), adj = 0)
if(!fixed) {
## sort them on the value at the last level of x.factor
ord <- sort.list(cells[nr, ], decreasing = TRUE)
ylabs <- ylabs[ord]
lty <- lty[1 + (ord - 1) %% length(lty)]
col <- col[1 + (ord - 1) %% length(col)]
pch <- pch[ord]
}
legend(xleg, yleg, legend = ylabs, col = col,
pch = if(type %in% c("p","b")) pch,# NULL works
lty = if(type %in% c("l","b")) lty,# NULL works
bty = leg.bty, bg = leg.bg)
}
invisible()
}