【问题标题】:dev.hold, dev.flush and resizing windowsdev.hold、dev.flush 和调整窗口大小
【发布时间】:2017-07-12 06:18:51
【问题描述】:

在 R 中,可以持有一个设备,绘制图片,然后刷新设备以渲染图形。这对于具有数千个数据点、颜色渐变等的非常复杂的绘图很有用,因为如果不保持,每次绘图操作后都会刷新设备。效果很好。

但是,一旦绘图就位,任何窗口操作(例如调整大小)都会导致绘图被刷新——但是,这一次没有按住和刷新设备,而是一个一个地绘制绘图元素并刷新每次显示。这非常烦人。

显然,我可以在调整窗口大小之前手动调用dev.hold,但这不是真正的解决方案。

有没有办法告诉 R 应该暂停设备以进行调整大小等操作?

【问题讨论】:

  • 要禁止在调整大小时绘制,您可以使用dev.control("inhibit"),但您不能保持/重绘/刷新它。我试过p <- recordPlot(),但replayPlot(p)(也不是grDevices:::restoreRecordedPlot)似乎不尊重dev.hold()。你的答案可能在the R source (mirrored by wch on github)。
  • 谢谢,虽然这并不能解决我的问题,但这是迈向解决方案的一步。
  • 也不是一个解决方案,但我倾向于在 rstudio 中绘制为 jpeg,因为那里的绘图窗口很小。我在 Windows 预览中保持 jpeg 打开并重复调用 jpeg 刷新它相当快。
  • 出于这个原因,我还建议不要将 R 图形设备用于复杂的绘图,如果绘图过于复杂,最好使用 pdf 或 png 或 jpeg 等光栅格式。

标签: r device window-resize


【解决方案1】:

正如 Dan Slone 和 gdkrmr 所指出的,可行的选择是使用中间光栅文件来绘制复杂的图形。

流程如下:

  1. 将绘图保存到png 文件。
  2. 将图像绘制到屏幕设备中。

在此之后,刷新和调整大小将没有问题。

请看下面的代码:

# plotting through png
plot.png <- function(x, y) {
  require(png)
  tmp <- tempfile()
  png(tmp, width = 1920, height = 1080)
  plot(x, y, type = "l")
  dev.off()
  ima <- readPNG(tmp)
  op <- par(mar = rep(0, 4))
  plot(NULL, xlim = c(0, 100), ylim = c(0, 100), xaxs = "i", yaxs = "i")
  rasterImage(ima, 0, 0, 100, 100, interpolate = TRUE)
  par(op)
  unlink(tmp)
}

t <- 1:1e3
x <- t * sin(t)
y <- t * cos(t)


# without buffering
# plot(x, y, type = "l")

# with buffering in high-res PNG-file
plot.png(x, y)

输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2012-12-15
    • 2012-05-20
    相关资源
    最近更新 更多