如何使用 par(xpd=T) 在绘图区域外绘制图像?

How to plot image outside plot area with par(xpd=T)?

在 R 中,我试图在绘图区域外绘制图像(作为图例)。但是,par(xpd=T)par(xpd=NA) 似乎不起作用。

这是错误的最小可重现示例,生成以下图表。

par(mar=c(4,4,4,4),xpd=F)
plot(1:2,1:2)
x <- c(2,2.1)
y <- seq(1.1,1.9,len=10)
m <- matrix(seq(0,1,len=10),ncol=10,nrow=2,byrow=T)
par(xpd=T)
image(x-.2,y,m,add=T)
image(x+.05,y,m,add=T)
par(xpd=NA)
image(x-.2,y,m,add=T)
image(x+.05,y,m,add=T)

两个彩色条应该具有相同的宽度,但当然右边的条被剪掉了,这与 par 的帮助中所说的不同:

xpd

A logical value or NA. If FALSE, all plotting is clipped to the plot region, if TRUE, all plotting is clipped to the figure region, and if NA, all plotting is clipped to the device region. See also clip.

这是一个错误,还是我做错了什么?

我正在使用 R 版本 3.3.3 (2017-03-06) -- "Another Canoe",平台:x86_64-pc-linux-gnu(64 位),RStudio 版本 1.1.447,在Debian 扩展。

坦率地说,我无法直接回答你的问题。我很确定它与 image() 有关,因为 xpd = TRUE 适用于 text().

等其他功能

这里有两个或多或少的 hacky 解决方案,它们对我适用于你的 MWE,希望对你的实际情节有所帮助:

x <- c(2, 2.1)
y <- seq(1.1, 1.9, len = 10)
m <- matrix(seq(0, 1, len = 10),
            ncol = 10, nrow = 2, byrow = TRUE)

# Solution 1: useRaster = TRUE
par(mar = c(4, 4, 4, 4), xpd = TRUE)
plot(1:2, 1:2)
image(x + .05, y, m, add = TRUE, useRaster = TRUE)
# text(x + .05, y, "foo")

# Solution 2: grid.clip() plus image() twice
par(mar = c(4, 4, 4, 4), xpd = TRUE)
plot(1:2, 1:2)
image(x + .05, y, m, add = TRUE)
grid::grid.clip()
image(x + .05, y, m, add = TRUE)