Save plot without showing it at all

2020-03-03 05:34发布

Is it possible to save a plot without displaying it at all ?

I made a little ggplot hack to be able to copy graphs to powerpoint easily, it copies the plot to the clipboard, but one can see the device window open and close fast, it's a bit awkward, can I avoid this ?

I'm using windows and rstudio.

reproducible code:

library(ggplot)

`-.gg` <- function(e1,e2){
  assertthat::assert_that(is.numeric(e2),
                          length(e2)<= 2)
  if(identical(e2,0)) return(invisible(NULL))
  W <- 8
  H <- 4.5
  dev.new(width=W * head(e2,1), height=H * tail(e2,1),noRStudioGD =TRUE)
  print(e1)
  savePlot("clipboard", type="wmf")
  dev.off()
  e1
}

ggplot(data.frame(x=1:10,y=1:10),aes(x,y)) + geom_point() - 1 - 0

Edit:

My code, and chosen solution, have issues dealing with semi-transparency.It's ok most of the time, but exceptions will be annoying. Maybe a path to a general solution would be to save it with tempfile then read it into the clipboard, either through an appropriate R function, or with command line using system (maybe something that would open the file invisibly and copy).

2条回答
我只想做你的唯一
2楼-- · 2020-03-03 06:14

This works on Windows: use the win.metafile() device. If you give no filename, it saves to the clipboard. So your function should be

library(ggplot2)

`-.gg` <- function(e1,e2){
  assertthat::assert_that(is.numeric(e2),
                          length(e2)<= 2)
  if(identical(e2,0)) return(invisible(NULL))
  W <- 8
  H <- 4.5
  win.metafile(width=W * head(e2,1), height=H * tail(e2,1))
  print(e1)
  dev.off()
  e1
}

ggplot(data.frame(x=1:10,y=1:10),aes(x,y)) + geom_point() - 1 - 0
查看更多
▲ chillily
3楼-- · 2020-03-03 06:15

On windows and R 3.4.2, using Sys.sleep was able to view the plot instead of blink and miss

`-.gg` <- function(e1,e2){
    assertthat::assert_that(is.numeric(e2),
                      length(e2)<= 2)
    if(identical(e2,0)) return(invisible(NULL))
     W <- 8
     H <- 4.5
    dev.new(width=W * head(e2,1), height=H * tail(e2,1),noRStudioGD =TRUE)
    print(e1)
    savePlot("clipboard", type="wmf")
    Sys.sleep(3) ##
    dev.off()
    e1
 }

ggplot(data.frame(x=1:10,y=1:10),aes(x,y)) + geom_point() - 1 - 0
查看更多
登录 后发表回答