代码之家  ›  专栏  ›  技术社区  ›  Rodrigo

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

  •  1
  • Rodrigo  · 技术社区  · 6 年前

    在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,则所有绘图都将剪切到 绘图区域,如果为真,则所有绘图都将剪裁到图形区域, 如果没有,所有的绘图都会被剪切到设备区域。另请参见 削减。

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

    我使用的是R版本3.3.3(2017-03-06)——“另一只独木舟”,平台:x86-PC-Linux-GNU(64位),带有rstudio版本1.1.447,位于Debian Stretch。

    1 回复  |  直到 6 年前
        1
  •  1
  •   hplieninger    6 年前

    坦率地说,我对你的问题没有直接的回答。我很肯定这和 image() ,因为 xpd = TRUE 其他功能如 text() .

    以下是两个或多或少的黑客解决方案,我与您的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)