web-dev-qa-db-ja.com

dev.hold、dev.flush、およびウィンドウのサイズ変更

Rでは、デバイスを持って絵を描き、デバイスをフラッシュしてグラフィックをレンダリングすることができます。これは、何千ものデータポイント、色のグラデーションなどを含む非常に複雑なプロットに役立ちます。保持しないと、各プロット操作の後にデバイスが更新されるためです。それは非常にうまく機能します。

ただし、プロットが配置されると、サイズ変更などのウィンドウ操作によってプロットが更新されます。ただし、今回はデバイスを保持してフラッシュすることなく、プロット要素を1つずつプロットし、毎回表示を更新します。 。これは非常に迷惑です。

明らかに、手動で呼び出すことができますdev.holdウィンドウのサイズを変更する前ですが、これは実際の解決策ではありません。

サイズ変更などの操作のためにデバイスを保留にする必要があることをRに伝える方法はありますか?

57
January

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)

Ouput: picture

2
Artem