【问题标题】:reset par() in functions在函数中重置 par()
【发布时间】:2017-03-04 00:28:24
【问题描述】:

在 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

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

【问题讨论】:

  • 请参阅?parno.readonly 的描述,如何将参数reset_par 添加到您的函数中,以便您可以控制是否重置par 设置。你也可以在第一个pfun之后添加par(mfg = c(1,1))
  • 啊...谢谢。 no.readonly 部分解决了警告。我想我可以为函数添加一个额外的参数。我希望有一个不需要用户输入的替代解决方案,但这是个好主意。
  • 谢谢,这也有效,但更大的上下文是我工作中的人们正在使用的包中的一个函数,我宁愿不必教他们在每次调用之前在进行多面板绘图时与par(mfg = c(1, 1)) 一起使用。我认为附加参数可能是最好的选择。
  • 也许我应该编辑原始帖子,但@rawr 修复了警告问题。我只需要将no.readonly = TRUE 添加到对par() 的调用中。

标签: r plot


【解决方案1】:

我们可以避免干扰多面板图,只需保存/恢复我们在函数中更改的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))

【讨论】:

  • 漂亮!真的做得很好,而且完全有道理。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-11-24
  • 2015-04-12
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多