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

时间:2018-05-28 03:14:42

标签: r plot clip

在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)

R plot image bug

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

  

XPD

     

逻辑值或NA。如果为FALSE,则所有绘图都被剪切到   绘图区域,如果为TRUE,则所有绘图都剪切到图形区域,   如果是NA,则所有绘图都被剪切到设备区域。也可以看看   剪辑

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

我正在使用R版本3.3.3(2017-03-06) - &#34;另一个独木舟&#34;,平台:x86_64-pc-linux-gnu(64位),带有RStudio版本1.1.447,在Debian Stretch中。

1 个答案:

答案 0 :(得分:1)

坦率地说,我对你的问题没有直接的答案。我很确定它与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)