重置函数中的par()

时间:2017-03-04 00:28:25

标签: r plot

在R中编写绘图函数时,我不想修改全局环境,所以我包含了类似

的内容
op <- par()
on.exit(par(op))

但这不太令人满意,因为它会发出警告信息(例如"In par(op) : graphical parameter "cin" cannot be set"),但更重要的是,它与多面板图不兼容。例如,如果我有一个像

这样的简单函数
pfun <- function(x) {
    op <- par()
    on.exit(par(op))

    par(bg = "gray21", col = "deeppink", col.axis = "deeppink")
    plot(x, 
        xaxt = "n",
        yaxt = "n",
        col = "deeppink", 
        cex = 2, 
        pch = 22, 
        bg = "deeppink",
        col.lab = "deeppink")
    axis(1, col = "deeppink")
    axis(2, col = "deeppink")
}

它适用于单个绘图(除了警告之外),但与多面板图不兼容,例如

par(mfrow = c(2, 2))
pfun(1:10)
pfun(10:1) # overwrites the first plot rather than plotting in the second panel

是否有办法在退出时重置绘图参数,同时还允许多面板绘图?

1 个答案:

答案 0 :(得分:5)

我们可以通过仅保存/恢复我们在函数中更改的par元素来避免干扰多面板图。在这种情况下,这意味着只存储bgcolaxis.col。重要的是避免干扰控制多时隙位置的图形参数(特别是mfrowmfcolmfg)。

pfun <- function(x) {
  op <- par('bg', 'col', 'col.axis')
  on.exit(par(op))

  par(bg = "gray21", col = "deeppink", col.axis = "deeppink")
  plot(x, 
    xaxt = "n",
    yaxt = "n",
    col = "deeppink", 
    cex = 2, 
    pch = 22, 
    bg = "deeppink",
    col.lab = "deeppink")
  axis(1, col = "deeppink")
  axis(2, col = "deeppink")
}

或者,即使是稍微整洁也是要利用这样一个事实:当我们使用par设置参数时,它会无形地返回我们更改的参数的值列表。因此,以下内容将很好地运作:

  op <- par(bg = "gray21", col = "deeppink", col.axis = "deeppink")
  on.exit(par(op))