将相等的绘图空间分配给具有共享轴的所有多个绘图

时间:2015-08-18 03:25:26

标签: r plot

我尝试平铺图表,特别是在2x3矩阵中,例如:

x <- seq(1, 10, by=.01)
y <- 1/x

prms<-
  list(xlab=rep(c("", "x"), each=3),
       ylab=rep(c("y", "", ""), 2),
       xaxt=rep(c("n", "s"), each=3),
       yaxt=rep(c("s", "n", "n"), 2),
       mar=list(c(0  , 4.1, 4.1,   0),
                c(0  ,   0, 4.1,   0),
                c(0  ,   0, 4.1, 1.1),
                c(5.1, 4.1,   0,   0),
                c(5.1,   0,   0,   0),
                c(5.1,   0,   0, 1.1)))

par(mfrow=c(2, 3))
for (ii in 1:6){
  par(mar=prms$mar[[ii]])
  plot(x, y, type="l", lwd=2,
       xlab=prms$xlab[ii], ylab=prms$lab[ii],
       xaxt=prms$xaxt[ii], yaxt=prms$yaxt[ii])
}

产生:

enter image description here

我已经压制了&#34;内部&#34;边距和轴因为所有x(resp。,y)单位都相同,所以这些轴是多余的。但是,正如你所看到的那样,通过挤压左边和右边地块的边缘,我意外地给了中间地块太多的空间(它不是那么明显,但同样的麻烦困扰着最高层。 - 在底行)。

这就是难题。 mfrow为每个子图(即轴,边距等)分配相等的空间,而不是每个绘图区域。如何改变我的方法,使每个绘图区域大小相等, ceteris paribus (即轴等不变)?我想过使用layout,但是没有想到一个很好的程序化方法来确保一切都具有相同的代表性。

1 个答案:

答案 0 :(得分:4)

您可以将mar设置为0,并使用oma来指定外边距的大小。轴被添加到循环中的相关图中。常见的x和y轴标签添加了mtextouter = TRUE

par(mfrow = c(2, 3),
    mar = c(0, 0, 0, 0),
    oma = c(4, 4, 0.5, 0.5))

for (i in 1:6) {
  plot(x, y, type = "l", axes = FALSE)
  if (i %in% c(4, 5, 6))
    axis(side = 1)
  if (i %in% c(1, 4))
    axis(side = 2)
  box()
  }

mtext("x values", side = 1, outer = TRUE, line = 2.5)
mtext("y values", side = 2, outer = TRUE, line = 2.5)

enter image description here

另见How to create multiple plots, each with same plot area size, when only one plot has axis labels?