Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dev.hold, dev.flush and resizing windows

In R, it is possible to hold a device, draw the picture, and then flush the device to render the graphics. This is useful for very complex plots with thousands of data points, color gradients etc since without holding, the device would be refreshed after each plotting operation. It works quite well.

However, once the plot is in place, any window operation such as a resize will cause the plot to be refreshed -- however, this time without holding and flushing the device, but plotting the plot elements one by one and refreshing the display each time. This is extremely annoying.

Clearly, I could call manually dev.hold before resizing the window, but this is not a real solution.

Is there a way of telling R that the device should be put on hold for operations such as resize?

like image 421
January Avatar asked Feb 22 '17 09:02

January


1 Answers

As indicated by Dan Slone and gdkrmr viable option is to use intermediate raster file to plot complex graphics.

The flow is the follows:

  1. Save plot to png file.
  2. Plot the image into the screen device.

After this there will be no problems with refreshing and resizing.

Please see the code below:

# 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

like image 89
Artem Avatar answered Nov 13 '22 20:11

Artem