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.

*Related*

If you got this far, why not

__subscribe for updates__ from the site? Choose your flavor:

e-mail,

twitter,

RSS, or

facebook...