(This article was first published on Noam Ross - R, and kindly contributed to R-bloggers)
At DRUG today, Chris Hamm () showed us an easier way to combine multiple figures into one plot using plot.new, rather than par(mfrow=...) Here’s his script:
# plot.new() cahamm@ucdavis.edu #I discovered this plotting method when trying to add an inset figure # to a plot # plot.new is part of the traditional graphics. This function starts a new plot with the # scale of the x- and y- axes to (0,1) This allows you to specify the location of each # pane or inset and provides a high level of customizability for R graphics ############### Plotting multiple panes, the old way par(mfrow = c(3, 1)) plot(P2B1$TMP, ylab = "Degrees C", xlab = "3 January - 13 March, 2011", type = "l", lty = 1, ylim = c(-25, 15), xaxt = "n", lwd = 2) lines(P2T1$TMP, type = "l", lty = 2, col = "red", lwd = 2) # line at DD50 (10C = 50F) legend("topleft", legend = c("Ground Level", "1m Height"), col = c("black", "red"), lty = c(1, 2), lwd = c(2, 2), bty = "n") plot(P2B2$TMP, ylab = "Degrees C", xlab = "13 March - 7 May, 2011", type = "l", lty = 1, lwd = 2, ylim = c(-10, 35), xaxt = "n") lines(P2T2$TMP, col = "red", lwd = 2, lty = 2) plot(P2B3$TMP, ylab = "Degrees C", xlab = "7 May - 16 July, 2011", type = "l", ylim = c(0, 38), xaxt = "n", lwd = 2) lines(P2T3$TMP, col = "red", lwd = 2, lty = 2)
#### Using the new way par(mar = c(1, 5, 0, 0)) #set up the margins for the overall plot quartz(height = 8, width = 8) par(fig = c(0, 1, 0.65, 1), new = T) #now tell it where you want the new plot, reads x1 x2, y1 y2 (left and right bounds, top and bottom bounds)
## Warning: calling par(new=TRUE) with no plot
par(mar = c(3, 6, 1, 1)) #set the margins for the new plot plot.new() plot(P2B1$TMP, ylab = "", xlab = "", type = "l", lty = 1, ylim = c(-25, 15), xaxt = "n", lwd = 3, las = 1, bty = "l", cex.axis = 1.5) mtext("3 January - 13 March, 2011", side = 1, line = 0.5, adj = 0.5, cex = 1.5) lines(P2T1$TMP, type = "l", lty = 4, col = "red", lwd = 2) legend(x = 0, y = 19, legend = c("1m Height", "Ground Level"), col = c("red", "black"), lty = c(4, 1), lwd = c(3, 2), bty = "n") par(fig = c(0, 1, 0.35, 0.7), new = T) par(mar = c(3, 6, 1, 1)) plot.new() plot(P2B2$TMP, ylab = (expression(paste("Temperature (", degree, "C)"))), xlab = "", type = "l", lty = 1, lwd = 3, ylim = c(-10, 35), xaxt = "n", bty = "l", las = 1, cex.axis = 1.5, cex.lab = 1.5) lines(P2T2$TMP, col = "red", lwd = 2, lty = 4) mtext("13 March - 7 May, 2011", side = 1, line = 0.5, adj = 0.5, cex = 1.5) par(fig = c(0, 1, 0, 0.35), new = T) par(mar = c(3, 6, 1, 1)) plot.new() plot(P2B3$TMP, ylab = "", xlab = "", type = "l", lty = 1, ylim = c(0, 38), xaxt = "n", lwd = 3, las = 1, bty = "l", cex.axis = 1.5) lines(P2T3$TMP, col = "red", lwd = 2, lty = 4) mtext("7 May - 16 July, 2011", side = 1, line = 0.5, adj = 0.5, cex = 1.5)
############# Puting it all together library(MASS) library(MCMCpack) library(compositions) library(grDevices) w <- rdirichlet(50000, c(5, 0.5, 2)) colnames(w) <- c("A", "B", "C") ind1 <- rmultinom(1, 40, w[1, ]) ind2 <- rmultinom(1, 22, w[2, ]) quartz(width = 6.8, height = 4.5) par(fig = c(0.4, 0.6, 0.75, 0.95), mar = c(0, 0, 0, 0)) plot.rcomp(w, col = rgb(1, 0, 0, 0.1), pch = ".", labels = c("A", "B", "C")) # Individual count data par(fig = c(0, 1, 0.1, 0.3), new = TRUE) # plot.window(xlim=c(0,1),ylim=c(0,0.75)) plot.new() # text(0.2,0.2,'x',font=3,family='Arial',cex=2) text(0.1, 0.6, expression(italic(x[paste("1A")]) == 36), pos = 4) text(0.1, 0.4, expression(italic(x[paste("1B")]) == 1), pos = 4) text(0.1, 0.2, expression(italic(x[paste("1C")]) == 3), pos = 4) text(0.4, 0.6, expression(italic(x[paste("2A")]) == 15), pos = 4) text(0.4, 0.4, expression(italic(x[paste("2B")]) == 3), pos = 4) text(0.4, 0.2, expression(italic(x[paste("2C")]) == 11), pos = 4) text(0.74, 0.6, expression(italic(x[paste("iA")]) == 13), pos = 4) text(0.74, 0.4, expression(italic(x[paste("iB")]) == 4), pos = 4) text(0.74, 0.2, expression(italic(x[paste("iC")]) == 5), pos = 4) # individual probs given count data Px1 <- c(36, 1, 3)/40 Px2 <- c(15, 3, 11)/29 Px3 <- c(13, 4, 5)/22 par(fig = c(0.15, 0.25, 0.4, 0.6), new = TRUE) plot.new() barplot(Px1, names.arg = c(" "), ylim = c(0, 1), col = "red", cex.axis = 0.5, cex.names = 0.75, las = 1) mtext("A B C", side = 1) abline(h = 0, lwd = 2) par(fig = c(0.43, 0.53, 0.4, 0.6), new = TRUE) plot.new() barplot(Px2, names.arg = c(" "), ylim = c(0, 1), col = "red", cex.axis = 0.5, cex.names = 0.75, las = 1) mtext("A B C", side = 1) abline(h = 0, lwd = 2) par(fig = c(0.74, 0.84, 0.4, 0.6), new = TRUE) # par(fig=c(0.71,0.81,0.4,0.6),new=TRUE) plot.new() barplot(Px3, names.arg = c(" "), ylim = c(0, 1), col = "red", cex.axis = 0.5, cex.names = 0.75, las = 1) mtext("A B C", side = 1) abline(h = 0, lwd = 2) par(fig = c(0, 1, 0, 1), new = TRUE) plot.new() text(0.62, 0.51, expression(...), pos = 2, cex = 2) text(0.08, 0.5, expression(italic(Px[paste("1j", sep = "")]) == ""), pos = 2, cex = 1) text(0.38, 0.5, expression(italic(Px[paste("2j", sep = "")]) == ""), pos = 2, cex = 1) text(0.71, 0.5, expression(italic(Px[paste("ij", sep = "")]) == ""), pos = 2, cex = 1) # text(0.68,0.5,expression(italic(Px[paste('ij',sep='')])==''),pos=2,cex=1) text(0.04, 0.22, "Individual\ncounts", pos = 1, cex = 1) text(-0.05, 0.65, "Individual probabilities", pos = 4, cex = 1) text(0.04, 0.87, "Population", pos = 1, cex = 1) arrows(0.16, 0.23, 0.16, 0.33, angle = 20, length = 0.15, lwd = 2) arrows(0.46, 0.23, 0.46, 0.33, angle = 20, length = 0.15, lwd = 2) arrows(0.795, 0.23, 0.795, 0.33, angle = 20, length = 0.15, lwd = 2) arrows(0.53, 0.75, 0.7, 0.63, angle = 20, length = 0.15, lwd = 2, code = 3) arrows(0.47, 0.75, 0.3, 0.63, angle = 20, length = 0.15, lwd = 2, code = 3) arrows(0.5, 0.75, 0.5, 0.63, angle = 20, length = 0.15, lwd = 2, code = 3) text(0.72, 0.89, expression(italic(alpha["A"]) == "5.0"), pos = 1, cex = 1) text(0.72, 0.85, expression(italic(alpha["B"]) == "0.5"), pos = 1, cex = 1) text(0.72, 0.81, expression(italic(alpha["C"]) == "2.0"), pos = 1, cex = 1) text(0.92, 0.65, "Multinomial") text(0.94, 0.87, "Dirichlet") text(0.083, 0.95, expression(underline("Hierarchical level")), cex = 1.2) text(0.89, 0.95, expression(underline("Modeled distribution")), cex = 1.2)
To leave a comment for the author, please follow the link and comment on his blog: Noam Ross - R.
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...

Zero Inflated Models and Generalized Linear Mixed Models with R.
Zuur, Saveliev, Ieno (2012).