[R] Multiple plots on one device using stl
Ben Madin
lists at remoteinformation.com.au
Wed May 18 03:54:55 CEST 2011
G'day,
I am looking at monthly reports, and have three series of monthly data from 2007 to 2009. I would like to show the season decomposition of these two series side by side on the one device, however using plot doesn't seem to respect any use of layout(matrix(1:3, ncol=3)) or par(mfcol=c(1,3)).
I'm guessing that this means that the plot(stl) perhaps uses them, but I can't find anywhere the / a plot.stl() - ie, I can't work out where the plot() call is going?
I've attached a small example of data and some probably overly verbose code. There are only two sets of example data, not three as mentioned above.
# load the data
vals.1 <-
structure(list(year = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("2007",
"2008", "2009"), class = c("ordered", "factor")), month = structure(c(1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L,
5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L,
8L, 9L, 10L, 11L, 12L), .Label = c("Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), class = c("ordered",
"factor")), count = c(105, 100, 64, 44, 49, 65, 88, 90, 99, 92,
93, 88, 212, 146, 96, 131, 220, 143, 137, 138, 395, 362, 349,
222, 294, 268, 298, 310, 426, 348, 287, 101, 66, 112, 105, 4)), .Names = c("year",
"month", "count"), row.names = c("1", "2", "3", "4", "5", "6",
"7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17",
"18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28",
"29", "30", "31", "32", "33", "34", "35", "36"), class = "data.frame")
vals.2 <-
structure(list(year = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("2007",
"2008", "2009"), class = c("ordered", "factor")), month = structure(c(1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L,
5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L,
8L, 9L, 10L, 11L), .Label = c("Jan", "Feb", "Mar", "Apr", "May",
"Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), class = c("ordered",
"factor")), count = c(45, 34, 17, 6, 7, 16, 12, 11, 14, 17, 11,
20, 27, 12, 10, 14, 22, 23, 92, 144, 385, 274, 320, 252, 240,
146, 222, 142, 122, 117, 163, 89, 51, 89, 108)), .Names = c("year",
"month", "count"), row.names = c("1", "2", "3", "4", "5", "6",
"7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17",
"18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28",
"29", "30", "31", "32", "33", "34", "35"), class = "data.frame")
# create the time series
series.1 <- ts(vals.1$count, start=c(2007,1), freq=12)
series.2 <- ts(vals.2$count, start=c(2007,1), freq=12)
# apply the seasonal decomposition
stl.1 <- stl(series.1, "per", robust=TRUE)
stl.2 <- stl(series.2, "per", robust=TRUE)
# set up the device for side by side display
layout(matrix(1:2, ncol=2))
# little check
layout.show(2)
# plot the first series and second series
plot(stl.1, labels = c('Count by month','Seasonal Component','Trend','Remainder'), main='Series.1 Decomposition')
plot(stl.2, labels = c('Count by month','Seasonal Component','Trend','Remainder'), main='Series.2 Decomposition')
# hmm, used whole device twice, try again
par(mfcol=c(1,2))
# and now the second
plot(stl.1, labels = c('Count by month','Seasonal Component','Trend','Remainder'), main='Series.1 Decomposition')
plot(stl.2, labels = c('Count by month','Seasonal Component','Trend','Remainder'), main='Series.2 Decomposition')
# oh what about split.screen()
split.screen(c(1,2))
screen(1)
# now plot
plot(stl.1, labels = c('Count by month','Seasonal Component','Trend','Remainder'), main='Series.1 Decomposition')
# something wrong with the plot, not seeing original series at the top.
screen(2)
# Error in par(split.screens[[n]]) : parameter "j" in "mfg" is out of range
cheers
Ben
>SessionInfo()
R version 2.13.0 Patched (2011-05-05 r55784)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:
[1] en_AU.UTF-8/en_AU.UTF-8/C/C/en_AU.UTF-8/en_AU.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
More information about the R-help
mailing list