G'day Bill, On 18/05/2011, at 10:36 AM, <bill.venab...@csiro.au> wrote:
> If you > > ?plot.stl > > you will see that that the second argument, set.pars, is a list of argument > settings for par(), including a (variable) default setting for mfrow. I.e. > plot.stl overrides your external setting (which will also override any > layout() setting). > > It looks like to override it back, you may need to take charge yourself. > Here is the gist of a partial way round it, perhaps, sort of. ... > > ################ > par(mar = c(0, 6, 0, 6), oma = c(6, 0, 4, 0), > tck = -0.01, mfcol = c(4, 2)) > > plot(stl.1, set.pars = list()) > plot(stl.2, set.pars = list()) > ################ Perfect - thank you very much - I had played with the set.pars, but it never occurred to me to send it a null list (both times) > Things might be a bit more flexible if you were to use xyplot.stl in the > latticeExtra package. With lattice the operations of making the plot and > displaying it are more cleanly separated. I'll look into it - thanks for the tip. cheers Ben > 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 -- Ben Madin AusVet Animal Health Services P.O. Box 5467 Broome WA 6725 Australia AusVet's website: http://www.ausvet.com.au ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.