(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() [email protected] #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...