blob: c5ef20d46a366b1650740d1de33ba1beab69af8c [file] [log] [blame]
# File src/library/stats/R/monthplot.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/
monthplot <- function(x, ...) UseMethod("monthplot")
monthplot.StructTS <-
function (x, labels = NULL, ylab = choice, choice = "sea", ...)
monthplot(fitted(x)[, choice], labels = labels, ylab = ylab, ...)
monthplot.stl <-
function (x, labels = NULL, ylab = choice, choice = "seasonal", ...)
monthplot(x$time.series[, choice], labels = labels, ylab = ylab, ...)
monthplot.ts <-
function (x, labels = NULL, times = time(x), phase = cycle(x),
ylab = deparse(substitute(x)), ...)
{
if (is.null(labels) & !missing(phase))
return(monthplot.default(x, times = times, phase = phase,
ylab = ylab, ...))
if (is.null(labels)) {
if (missing(phase)) {
f <- frequency(x)
if (f == 4) labels <- paste0("Q", 1L:4L)
else if (f == 12)
labels <- c("J", "F", "M", "A", "M", "J", "J",
"A", "S", "O", "N", "D")
else labels <- 1L:f
}
}
monthplot.default(x, labels = labels, times = times, phase = phase,
ylab = ylab, ...)
}
monthplot.default <-
function (x, labels = 1L:12L,
ylab = deparse(substitute(x)),
times = seq_along(x),
phase = (times - 1L)%%length(labels) + 1L, base = mean,
axes = TRUE, type = c("l", "h"), box = TRUE, add = FALSE,
col = par("col"), lty = par("lty"), lwd = par("lwd"),
col.base = col, lty.base = lty, lwd.base = lwd, ...)
{
dots <- list(...); nmdots <- names(dots)
type <- match.arg(type)
if (is.null(labels) || (missing(labels) && !missing(phase))) {
labels <- unique(phase)
phase <- match(phase, labels)
}
f <- length(labels)
if (!is.null(base))
means <- tapply(x, phase, base)
if (!add) {
dev.hold(); on.exit(dev.flush())
Call <- match.call()
Call[[1L]] <- quote(graphics::plot)
Call$x <- NA
Call$y <- NA
Call$axes <- FALSE
Call$xlim <- if("xlim" %in% nmdots) dots$xlim else c(0.55, f + 0.45)
Call$ylim <- if("ylim" %in% nmdots) dots$ylim else range(x, na.rm = TRUE)
Call$xlab <- if("xlab" %in% nmdots) dots$xlab else ""
if(box) Call$frame.plot <- TRUE
Call$labels <- Call$times <- Call$phase <- Call$base <-
Call$type <- Call$box <- Call$add <- Call$col.base <-
Call$lty.base <- Call$lwd.base <- NULL
eval(Call)
if (axes) {
axis(1, at = 1L:f, labels = labels, ...)
axis(2, ...)
}
if (!is.null(base)) {
segments(1L:f - 0.45, means, 1L:f + 0.45, means,
col = col.base, lty = lty.base, lwd = lwd.base)
}
}
y <- as.numeric(times)
scale <- 1 / diff(range(y, na.rm = TRUE)) * 0.9
for (i in 1L:f) {
sub <- phase == i
if (type != "h")
lines((y[sub] - min(y)) * scale - 0.45 + i, x[sub],
type = type, col = col, lty = lty, lwd = lwd, ...)
else segments((y[sub] - min(y)) * scale - 0.45 + i, means[i],
(y[sub] - min(y)) * scale - 0.45 + i, x[sub],
col = col, lty = lty, lwd = lwd, ...)
}
invisible()
}