Home > Net >  base R: How to add row titles to a 2 x 2 figure
base R: How to add row titles to a 2 x 2 figure

Time:01-31

I have a 2 x 2 figure where the columns represent two different variables and the rows represent two different locations. How can I add the names of the two locations to the two rows?

Example Data

library(biwavelet)

par(mfrow = c(2,2),
    oma = c(3,3,0,0)   0.1,
    mar = c(1,1,1,1)   0.1)

dat <- as.data.frame(matrix(nrow = 500, ncol = 2))

dat[1] <- seq(1,500)
dat[2] <- sin(dat[1])

# top-left figure
plot(wt(dat),
     xaxt = 'n',
     xlab = "",
     cex.axis = 1.5,
     cex.lab = 1.5)
axis(1, at = seq(0, 500, by = 100), cex.axis = 0.1, col.axis = 'NA')
title("Variable 1", line = 0.1, cex.main = 1.5)

# top-right figure
dat[2] <- sin(dat[1]*.5)
plot(wt(dat),
     xaxt = 'n',
     col.axis = 'NA',
     xlab = "",
     ylab = "")
axis(1, at = seq(0, 500, by = 100), cex.axis = 0.1, col.axis = 'NA')
title("Variable 2", line = 0.1, cex.main = 1.5)

# bottom-left figure
dat[2] <- sin(dat[1]*.25)
plot(wt(dat),
     cex.axis = 1.5)

# bottom-right figure
dat[2] <- sin(dat[1]*.125)
plot(wt(dat),
     col.axis = 'NA',
     ylab = "",
     xlab = "")
axis(1, at = seq(0, 500, by = 100), cex.axis = 1.5)

title(xlab = "Time (hours)",
      ylab = "Period",
      outer = TRUE,
      line = 1.5,
      cex.lab = 1.5)

The ideal figure would look like this enter image description here

CodePudding user response:

Here's one method:

par(mfrow=c(2,2))
par(mar = c(1,1,1,1)   0.1)
plot(disp ~ mpg, data = mtcars)
mtext("disp 1", side=3)
plot(I(2*disp) ~ mpg, data = mtcars)
mtext("disp 2", side=3)
mtext("mpg 1", side=4)
plot(disp ~ I(2*mpg), data = mtcars)
plot(I(2*disp) ~ I(2*mpg), data = mtcars)
mtext("mpg 2", side=4)

base graphics plot, 2x2 grid

Unfortunately, mtext does not support rotating text, so you're stuck with the right labels being oriented as they are.

CodePudding user response:

In case anyone stumbles across this page, the code I ended up using was based on @r2evans answer, see below.

par(mfrow = c(2,2),
    oma = c(3,3,0.5,0.5)   0.1,
    mar = c(1,1,1.1,1.1)   0.1)

dat <- as.data.frame(matrix(nrow = 500, ncol = 2))

dat[1] <- seq(1,500)
dat[2] <- sin(dat[1])

# top-left figure
plot(wt(dat),
     xaxt = 'n',
     xlab = "",
     cex.axis = 1.5,
     cex.lab = 1.5)
axis(1, at = seq(0, 500, by = 100), cex.axis = 0.1, col.axis = 'NA')
mtext("Variable 1", side = 3, cex = 1.5, line = 0.1)

# top-right figure
dat[2] <- sin(dat[1]*.5)
plot(wt(dat),
     xaxt = 'n',
     col.axis = 'NA',
     xlab = "",
     ylab = "")
axis(1, at = seq(0, 500, by = 100), cex.axis = 0.1, col.axis = 'NA')
mtext("Variable 2", side = 3, cex = 1.5, line = 0.1)
mtext("Location 1", side = 4, cex = 1.5, line = 0.5)

# bottom-left figure
dat[2] <- sin(dat[1]*.25)
plot(wt(dat),
     cex.axis = 1.5)

# bottom-right figure
dat[2] <- sin(dat[1]*.125)
plot(wt(dat),
     col.axis = 'NA',
     ylab = "",
     xlab = "")
axis(1, at = seq(0, 500, by = 100), cex.axis = 1.5)
mtext("Location 2", side = 4, cex = 1.5, line = 0.5)

title(xlab = "Time (hours)",
      ylab = "Period",
      outer = TRUE,
      line = 1.5,
      cex.lab = 1.5)

enter image description here

CodePudding user response:

Neither of the suggested solutions so far have put the right-hand labels in the orientation requested. You cannot do so with mtext, but rather need to use text, first allowing text to display outside the plot region with par(xpd=NA). (See ?text and ?par, where one reads that the srt,rotation, parameter only applies to text):

par(mfrow=c(2,2), xpd=FALSE)
par(mar = c(1,1,1,1)   2)
plot(disp ~ mpg, data = mtcars)
mtext("disp 1", side=3)
plot(I(2*disp) ~ mpg, data = mtcars)
mtext("disp 2", side=3); par(xpd=NA)
text("mpg 1",  x=36, y=500, srt=270)
plot(disp ~ I(2*mpg), data = mtcars); par(xpd=NA)
plot(I(2*disp) ~ I(2*mpg), data = mtcars)
text("mpg 2",  x=72, y=500, srt=270)

It is not as automatic as mtext in the sense that one needs to look at each plotting figure separately to derive a estimate for the x and y positions in the plotting coordinates.

enter image description here

  • Related