如何在R中的多图面板中跨越或在图之间进行注释

8

如果我在单个面板中有多个图形,我希望能够放置跨越多个图形区域或位于图形区域之间的文本注释。我相信一定有方法可以做到这一点,但我需要一些帮助来解决这个问题。
以下是一些虚假数据,用于创建一个面板上的四个图形:

x1 = rnorm(100)
x2 = rnorm(100)
x3 = rnorm(100)
x4 = rnorm(100)

par(mfrow=c(2,2)) 
hist(x1, xlab="", main="Group A")
hist(x2, xlab="", main="Group B")
hist(x3, xlab="", main="")
hist(x4, xlab="", main="")

这将创建下面的多图面板,除此之外,我还添加了红色文本。我是在 R 中创建图形面板后,再将其保存为 PDF 文件并在其中注释了红色文本。我想学习的是如何在 R 中以编程方式注释图形面板,而不是保存它并注释已保存的文件。
通常,我只需使用 text()mtext() 添加注释即可。但这仅适用于注释单个图形。是否有一种方法可以相对于 4 个图形面板的坐标添加注释?我现在正在寻找基本图形的解决方案,但如果有人知道如何在 ggplot2 或 lattice 中执行类似操作,我也很感兴趣。 enter image description here
4个回答

11

如果您真正希望更精细地控制这些布局问题,可以使用名为layout的恰当命名的工具。

m <- matrix(c(1,2,3,3,4,5,6,6),ncol = 2,byrow = TRUE)
layout(m,widths = c(0.5,0.5),heights = c(0.45,0.05,0.45,0.05))

par(mar = c(2,4,4,2) + 0.1)
hist(x1, xlab="", main="Group A")
hist(x2, xlab="", main="Group B")

par(mar = c(0,0,0,0)) 
plot(1,1,type = "n",frame.plot = FALSE,axes = FALSE)
u <- par("usr")
text(1,u[4],labels = "Here",col = "red",pos = 1)

par(mar = c(2,4,2,2) + 0.1)
hist(x3, xlab="", main="")
hist(x4, xlab="", main="")

par(mar = c(0,0,0,0)) 
plot(1,1,type = "n",frame.plot = FALSE,axes = FALSE)
u <- par("usr")
text(1,u[4],labels = "Here",col = "red",pos = 1)

输入图像描述


@mplourde 是的,layout功能相当不错。就像基础库中的其他一切一样,它可能有点棘手,但你肯定可以很快学会所有的参数设置。 - joran
做到了。感谢让我了解“布局”。我可以看到我会一遍又一遍地使用它。 - eipi10

7
您想要使用outer=TRUEmtext。例如,mtext('Results2', side=1, line=-2, outer=TRUE)mtext('Results1', side=3, line=-20, outer=TRUE)

你会把mtext放在上面的例子中的哪里?我无法使其工作。 - Shawn
在 OP 代码中最后一次调用 hist 后,您可能需要根据数据集的值调整行号(在 line=xx 中)。 - HelloWorld

4
对于这个例子,如前所示,layout函数是最简单的,但对于更一般的情况,您还应该学习grconvertXgrconvertY函数(以及使用par(xpd=设置剪切)。转换函数可以为您提供不同坐标系中当前用户坐标的坐标,因此例如,您可以通过将规范化设备坐标中的0.5转换来在页面上居中某些内容。

1
有人可能会认为,当你达到那个程度时,使用网格图形(也许与gridBase包结合使用)会更容易。 - baptiste
Grid和gridBase包确实值得一看,但我认为有很多情况下,已经很容易完成的一组基本图形可以通过使用'grconvertX'或'grconvertY'来简单地添加位置注释。 - Greg Snow

3

以下是使用Greg Snow的方法的示例:

par(mfrow=c(2, 2))
replicate(4, plot(matrix(runif(20), nrow=10)))
text(grconvertX(.5, "ndc", "user"), grconvertY(.25, "ndc", "user"), "TEST", cex=3, col="red", xpd=NA)
text(grconvertX(.5, "ndc", "user"), grconvertY(.75, "ndc", "user"), "TEST", cex=3, col="red", xpd=NA)

Overplot


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接