mfg, mfcol, mfrow, and layout() – secret friends

August 26, 2013
By

(This article was first published on Odd Hypothesis, and kindly contributed to R-bloggers)

I was working on an issue (enhancement) today in my groan R-package today that required adding additional plotting elements via lines() and points() to a device that had already been partitioned by layout(). The code I wanted to use was essentially:

# Y and S are lists of xy.coords() objects of the same length

lyt
= matrix(1:length(Y), ncol=10)
layout
(mat=lyt)

# function A
# plot Y first as points
lapply
(Y, function(x) {
plot
(x, ...)
})

# function B
# overlay S as lines on the grid of plots for Y
lapply
(S, function(x){
lines
(x, ...)
})

However, I would only get all of the above lines in one subplot. For a brief moment, I considered rewriting my whole set of plotting methods to use split.screen() or par(mfcol). Ugh!

On a whim, I decided to check what par('mfg') would return after a device had been partitioned and plotted to with:

layout(matrix(1:9, nrow=3))
par
(mar=c(0,0,0,0))
plot
(runif(10))

I was pleasantly surprised to find:

> par('mfg')
[1] 1 1 3 3

indicating that I could potentially direct the next plot in a layout()'ed device by setting the value of mfg= to the next plot id:

lyt = matrix(1:9, nrow=3)
par
(mfg=which(lyt == NextPlotID, arr.ind=TRUE)[1,])

Unicorns and rainbows, this works! (despite all the dire warnings in the documentation regarding incompatibilities)

Thus, the resulting code:

# Y and S are lists of xy.coords() objects of the same length

lyt
= matrix(1:length(Y), ncol=10)
layout
(mat=lyt)

# function A
# plot Y first as points
lapply
(Y, function(x) {
plot
(x, ...)
})

# function B
# overlay S as lines on the grid of plots for Y
lapply
(seq_along(S), function(n){
par
(mfg=which(lyt == n, arr.ind=TRUE)[1,]) # sets next plot in grid!
lines
(S[[n]], ...)
})

and issue resolved.

Written with StackEdit.

To leave a comment for the author, please follow the link and comment on his blog: Odd Hypothesis.

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...



If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...

Comments are closed.