plot.zoo
Plotting zoo Objects
Plotting method for objects of class "zoo"
.
- Keywords
- ts
Usage
## S3 method for class 'zoo':
plot(x, y = NULL, screens, plot.type,
panel = lines, xlab = "Index", ylab = NULL, main = NULL,
xlim = NULL, ylim = NULL, xy.labels = FALSE, xy.lines = NULL,
oma = c(6, 0, 5, 0), mar = c(0, 5.1, 0, 2.1),
col = 1, lty = 1, pch = 1, type = "l", nc, widths = 1, heights = 1, ...)
## S3 method for class 'zoo':
lines(x, y = NULL, type = "l", \dots)
## S3 method for class 'zoo':
points(x, y = NULL, type = "p", \dots)
Arguments
- x
- an object of class
"zoo"
. - y
- an object of class
"zoo"
. Ify
isNULL
(the default) a time series plot ofx
is produced, otherwise if bothx
andy
are univariate"zoo"
series, a scatt - screens
- factor (or coerced to factor) whose levels specify which
graph each series is to be plotted in.
screens=c(1,2,1)
would plot series 1, 2 and 3 in graphs 1, 2 and 1. If not specified then 1 is used ifplot.type="single"
- plot.type
- for multivariate zoo objects, "multiple" plots the
series on multiple plots and "single" superimposes them on a single
plot. Default is "single" if
screens
has only one level and"multiple"
otherwise. If neither - panel
- a
function(x, y, col, lty, ...)
which gives the action to be carried out in each panel of the display forplot.type = "multiple"
. - ylim
- if
plot.type = "multiple"
then it can be a list of y axis limits. If not a list each graph has the same limits. If any list element is not a pair then its range is used instead. Ifplot.type = "single"
then it is as - xy.labels
- logical, indicating if
text
labels should be used in the scatter plot, or character, supplying a vector of labels to be used. - xy.lines
- logical, indicating if
lines
should be drawn in the scatter plot. Defaults to the value ofxy.labels
if that is logical, otherwise toFALSE
. - xlab, ylab, main, xlim, oma, mar
- graphical arguments, see
par
. - col, lty, pch, type
- graphical arguments that can be vectors or (named) lists. See the details for more information.
- nc
- the number of columns to use when
plot.type = "multiple"
. Defaults to1
for up to4
series, otherwise to2
. - widths, heights
- widths and heights for individual graphs, see
layout
. - ...
- additional graphical arguments.
Details
The methods for plot
and lines
are very similar
to the corresponding ts
methods. However, the handling of
several graphical parameters is more flexible for multivariate series.
These parameters can be vectors of the same length as the number of
series plotted or are recycled if shorter. They can also be (partially)
named list, e.g., list(A = c(1,2), c(3,4))
in which c(3, 4)
is the default value and c(1, 2)
the value only for series A
.
The screens
argument can be specified in a similar way.
If plot.type
and screens
conflict then multiple plots
will be assumed. Also see the examples.
In the case of a custom panel the panel can reference
parent.frame$panel.number
in order to determine which
frame the panel is being called from. See examples.
par(mfrow=...)
and Axis
can be used in conjunction with
single panel plots in the same way as with other classic graphics.
For multipanel graphics, plot.zoo
takes over the layout so
par(mfrow=...)
cannot be used. Axis
can be used within
the panels themselves but not outside the panel. See examples.
In addition to classical time series line plots, there is also a
simple barplot
method for "zoo"
series.
See Also
Examples
## example dates
x.Date <- as.Date(paste(2003, 02, c(1, 3, 7, 9, 14), sep = "-"))
## univariate plotting
x <- zoo(rnorm(5), x.Date)
x2 <- zoo(rnorm(5, sd = 0.2), x.Date)
plot(x)
lines(x2, col = 2)
## multivariate plotting
z <- cbind(x, x2, zoo(rnorm(5, sd = 0.5), x.Date))
plot(z, type = "b", pch = 1:3, col = 1:3, ylab = list(expression(mu), "b", "c"))
colnames(z) <- LETTERS[1:3]
plot(z, screens = 1, col = list(B = 2))
plot(z, type = "b", pch = 1:3, col = 1:3)
plot(z, type = "b", pch = list(A = 1:5, B = 3), col = list(C = 4, 2))
plot(z, type = "b", screen = c(1,2,1), col = 1:3)
# right axis is for broken lines
plot(x)
opar <- par(usr = c(par("usr")[1:2], range(x2)))
lines(x2, lty = 2)
# axis(4)
Axis(side = 4)
par(opar)
## Custom x axis labelling using a custom panel.
# 1. test data
z <- zoo(c(21, 34, 33, 41, 39, 38, 37, 28, 33, 40),
as.Date(c("1992-01-10", "1992-01-17", "1992-01-24", "1992-01-31",
"1992-02-07", "1992-02-14", "1992-02-21", "1992-02-28", "1992-03-06",
"1992-03-13")))
zz <- merge(a = z, b = z+10)
# 2. axis tick for every point. Also every 3rd point labelled.
my.panel <- function(x, y, ..., pf = parent.frame()) {
fmt <- "%b-%d" # format for axis labels
lines(x, y, ...)
# if bottom panel
if (with(pf, length(panel.number) == 0 ||
panel.number %% nr == 0 || panel.number == nser)) {
# create ticks at x values and then label every third tick
Axis(side = 1, at = x, labels = FALSE)
ix <- seq(1, length(x), 3)
labs <- format(x, fmt)
Axis(side = 1, at = x[ix], labels = labs[ix], tcl = -0.7, cex.axis = 0.7)
}
}
# 3. plot
plot(zz, panel = my.panel, xaxt = "n")
# with a single panel plot a fancy x-axis is just the same
# procedure as for the ordinary plot command
plot(zz, screen = 1, col = 1:2, xaxt = "n")
# axis(1, at = time(zz), labels = FALSE)
tt <- time(zz)
Axis(side = 1, at = tt, labels = FALSE)
ix <- seq(1, length(tt), 3)
fmt <- "%b-%d" # format for axis labels
labs <- format(tt, fmt)
# axis(1, at = time(zz)[ix], labels = labs[ix], tcl = -0.7, cex.axis = 0.7)
Axis(side = 1, at = tt[ix], labels = labs[ix], tcl = -0.7, cex.axis = 0.7)
legend("bottomright", colnames(zz), lty = 1, col = 1:2)
## plot a mulitple ts series with nice x-axis using panel function
tab <- ts(cbind(A = 1:24, B = 24:1), start = c(2006, 1), freq = 12)
pnl.xaxis <- function(...) {
lines(...)
panel.number <- parent.frame()$panel.number
nser <- parent.frame()$nser
# if bottom panel
if (!length(panel.number) || panel.number == nser) {
tt <- list(...)[[1]]
ym <- as.yearmon(tt)
mon <- as.numeric(format(ym, "%m"))
yy <- format(ym, "%y")
mm <- substring(month.abb[mon], 1, 1)
# axis(1, tt[mon == 1], yy[mon == 1], cex.axis = 0.7)
Axis(side = 1, at = tt[mon == 1], labels = yy[mon == 1], cex.axis = 0.7)
# axis(1, tt[mon > 1], mm[mon > 1], cex.axis = 0.5, tcl = -0.3)
Axis(side = 1, at = tt[mon > 1], labels = mm[mon > 1], cex.axis = 0.5, tcl = -0.3)
}
}
plot(as.zoo(tab), panel = pnl.xaxis, xaxt = "n", main = "Fancy X Axis")
## Another example with a custom axis
# test data
z <- zoo(matrix(1:25, 5), c(10,11,20,21))
colnames(z) <- letters[1:5]
plot(zoo(coredata(z)), xaxt = "n", panel = function(x, y, ..., Time = time(z)) {
lines(x, y, ...)
# if bottom panel
pf <- parent.frame()
if (with(pf, panel.number %% nr == 0 || panel.number == nser)) {
Axis(side = 1, at = x, labels = Time)
}
})
## plot with left and right axes
## modified from http://www.mayin.org/ajayshah/KB/R/html/g6.html
set.seed(1)
z <- zoo(cbind(A = cumsum(rnorm(100)), B = cumsum(rnorm(100, mean = 0.2))))
opar <- par(mai = c(.8, .8, .2, .8))
plot(z[,1], type = "l",
xlab = "x-axis label", ylab = colnames(z)[1])
par(new = TRUE)
plot(z[,2], type = "l", ann = FALSE, yaxt = "n", col = "blue")
# axis(4)
Axis(side = 4)
legend(x = "topleft", bty = "n", lty = c(1,1), col = c("black", "blue"),
legend = paste(colnames(z), c("(left scale)", "(right scale)")))
usr <- par("usr")
# if you don't care about srt= in text then mtext is shorter:
# mtext(colnames(z)[2], 4, 2, col = "blue")
text(usr[2] + .1 * diff(usr[1:2]), mean(usr[3:4]), colnames(z)[2],
srt = -90, xpd = TRUE, col = "blue")
par(opar)
# automatically placed point labels
library("maptools")
pointLabel(time(z), coredata(z[,2]), labels = format(time(z)), cex = 0.5)
## plot one zoo series against the other.
plot(x, x2)
plot(x, x2, xy.labels = TRUE)
plot(x, x2, xy.labels = 1:5, xy.lines = FALSE)
## barplot
x <- zoo(cbind(rpois(5, 2), rpois(5, 3)), x.Date)
barplot(x, beside = TRUE)
# interactive plotting
library("TeachingDemos")
tke.test1 <- list(Parameters = list(
pch = list("spinbox", init = 1, from = 0, to = 255, width = 5),
cex = list("slider", init = 1.5, from = 0.1, to = 5, resolution = 0.1),
type = list("combobox", init = "b",
values = c("p", "l", "b", "o", "c", "h", "s", "S", "n"), width = 5),
lwd = list("spinbox", init = 1, from = 0, to = 5, increment = 1, width = 5),
lty = list("spinbox", init = 1, from = 0, to = 6, increment = 1, width = 5)
))
z <- zoo(rnorm(25))
tkexamp(plot(z), tke.test1, plotloc = "top")