我尝试平铺图表,特别是在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])
}
产生:
我已经压制了&#34;内部&#34;边距和轴因为所有x
(resp。,y
)单位都相同,所以这些轴是多余的。但是,正如你所看到的那样,通过挤压左边和右边地块的边缘,我意外地给了中间地块太多的空间(它不是那么明显,但同样的麻烦困扰着最高层。 - 在底行)。
这就是难题。 mfrow
为每个子图(即轴,边距等)分配相等的空间,而不是每个绘图区域。如何改变我的方法,使每个绘图区域大小相等, ceteris paribus (即轴等不变)?我想过使用layout
,但是没有想到一个很好的程序化方法来确保一切都具有相同的代表性。
答案 0 :(得分:4)
您可以将mar
设置为0,并使用oma
来指定外边距的大小。轴被添加到循环中的相关图中。常见的x和y轴标签添加了mtext
和outer = 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)
另见How to create multiple plots, each with same plot area size, when only one plot has axis labels?