将多个alignment的图块放在一个页面上时,避免浪费空间

我想把四个地块放在一个页面上。 轴标签只能在边框上打印,也就是只有底部的X轴标签,左侧的Y轴标签。 这既适用于整个轴的名称,也适用于单独的刻度标记。 我可以使用下面的代码沿着这些行生成一些东西:

pdf(file = "ExampleOutput.pdf", width = 6.61, height = 6.61, pointsize = 10 ) set.seed(42) catA <- factor(c("m100", "m500", "m1000", "m2000", "m3000", "m5000")) catB <- factor(20:28) samples <- 100 rsample <- function(v) v[ceiling(runif(samples, max=length(v)))] Tab <- data.frame(catA = rsample(catA), catB = rsample(catB), valA = rnorm(samples, 150, 8), valB = pmin(1,pmax(0,rnorm(samples, 0.5, 0.3)))) par(mfrow = c(2,2)) for (i in 0:3) { x <- Tab[[1 + i %% 2]] plot(x, Tab[[3 + i %/% 2]], xlab = if (i %/% 2 == 1) "Some Categories" else NULL, ylab = if (i %% 2 == 0) "Some Values" else NULL, axes = FALSE ) axis(side = 1, at=1:nlevels(x), labels = if (i %/% 2 == 1) levels(x) else FALSE) axis(side = 2, labels = (i %% 2 == 0)) box(which = "plot", bty = "l") } par(mfrow = c(1,1)) dev.off() 

我会欢迎有关如何改进绘图命令的build议,也许可以避免手动拖动左下angular的轴和L. 但这只是一个附加。

这个序列的结果如下所示:

电流输出

这里的问题是大量浪费的空白。 我有这样的印象,R即使没有使用,也会为轴和刻度标签预留空间。 由于这个浪费空间的结果,对于左下图,实际上只有每隔一秒钟被标记,这在这里是非常糟糕的。

我想生成一个没有太多空白空间的类似情节。 实际情节应该是相同的大小,所以他们正确排列,但标签的空间应该只在外面。 我想像这样的布局(在GIMP中创build的模型):

期望的输出

我怎样才能达到这样的布局?

假设y轴和x轴的标签属于所有的地块,这是对你所展示的总体情节的一个小的修改。 它使用外边距来包含轴标签,我们使用参数outer = TRUE添加title() 。 效果有点像ggplot2格子图中的标签。

这里的关键是:

 op <- par(mfrow = c(2,2), oma = c(5,4,0,0) + 0.1, mar = c(0,0,1,1) + 0.1) 

它设置了绘图参数(调用之前的值存储在op )。 我们在边1和边2上使用54行作为外边距,这是mar参数的常用数字。 绘制区域的边缘( mar )每行一个被添加到顶部和右侧,给小区之间的空间。

for()循环之后添加轴标签

 title(xlab = "Some Categories", ylab = "Some Values", outer = TRUE, line = 3) 

整个脚本是:

 set.seed(42) catA <- factor(c("m100", "m500", "m1000", "m2000", "m3000", "m5000")) catB <- factor(20:28) samples <- 100 rsample <- function(v) v[ceiling(runif(samples, max=length(v)))] Tab <- data.frame(catA = rsample(catA), catB = rsample(catB), valA = rnorm(samples, 150, 8), valB = pmin(1,pmax(0,rnorm(samples, 0.5, 0.3)))) op <- par(mfrow = c(2,2), oma = c(5,4,0,0) + 0.1, mar = c(0,0,1,1) + 0.1) for (i in 0:3) { x <- Tab[[1 + i %% 2]] plot(x, Tab[[3 + i %/% 2]], axes = FALSE) axis(side = 1, at=1:nlevels(x), labels = if (i %/% 2 == 1) levels(x) else FALSE) axis(side = 2, labels = (i %% 2 == 0)) box(which = "plot", bty = "l") } title(xlab = "Some Categories", ylab = "Some Values", outer = TRUE, line = 3) par(op) 

生产

在这里输入图像说明

只需操纵参数即可。 mar参数控制单个图的边距大小。 改变你的par这个:

 par(mfrow = c(2,2), mar=c(1, 4, 1, 1) + 0.1)#it goes c(bottom, left, top, right) 

在Gavin Simpson的回答中 ,我现在使用以下解决scheme:

 par(mfrow = c(2, 2), # 2x2 layout oma = c(2, 2, 0, 0), # two rows of text at the outer left and bottom margin mar = c(1, 1, 0, 0), # space for one row of text at ticks and to separate plots mgp = c(2, 1, 0), # axis label at 2 rows distance, tick labels at 1 row xpd = NA) # allow content to protrude into outer margin (and beyond) 

结果如下所示:

产生的图像

正如你所看到的,这足以允许打印所有的刻度标签。 如果不是,那么根据Gavin的评论 ,将小于1的cex.axis添加到参数列表应该有助于减小那里的字体大小。

您需要一个有条件的评估来分配适合于定位的par('mar')值; 以下是检查“x-layout-position”的代码示例(在循环中):

  pdf(file = "ExampleOutput2.pdf", width = 6.61, height = 6.61, pointsize = 10 ) set.seed(42) catA <- factor(c("m100", "m500", "m1000", "m2000", "m3000", "m5000")) catB <- factor(20:28) samples <- 100 rsample <- function(v) v[ceiling(runif(samples, max=length(v)))] Tab <- data.frame(catA = rsample(catA), catB = rsample(catB), valA = rnorm(samples, 150, 8), valB = pmin(1,pmax(0,rnorm(samples, 0.5, 0.3)))) par(mfrow = c(2,2), mar= c(3, 4, 1, 1) + 0.1) for (i in 0:3) { x <- Tab[[1 + i %% 2]] plot(x, Tab[[3 + i %/% 2]], mar= if(i %/%2 == 0) {c(4, 4, 1, 1) + 0.1 }else{c(1, 1, 1, 1) + 0.1}, xlab = if (i %/% 2 == 1) "Some Categories" else NULL, ylab = if (i %% 2 == 0) "Some Values" else NULL, axes = FALSE ) axis(side = 1, at=1:nlevels(x), labels = if (i %/% 2 == 1) levels(x) else FALSE) axis(side = 2, labels = (i %% 2 == 0)) box(which = "plot", bty = "l") } par(mfrow = c(1,1)) dev.off() 

您将需要调整以适应您的需要,因为它只处理两个保证金条件,而且您确实有4个单独的条件(两个都需要更多的底部空间,正确的需要更less的左侧空间和两个以上不同的需求),如果你缩小全局的'mar'值,它会切断你的x和y标签,就像在丢失xlab值的时候看到的那样。