通过查看器(导出)将交互式图表保存为(PNG)

时间:2017-11-08 11:25:44

标签: r

我希望将我的交互式图形保存为png,我可以通过查看器将其导出并将其导出为png但我已经有数千个并且必须自动将它们删除。

有一种方法是使用webshot包,但我尝试了这种方法并且需要很多时间,因为我想同时保存它们,例如:我使用生成的4000个html图表R并且必须在1分钟的时间间隔内将它们保存为图像,当我使用webshot时,它需要大约43分钟,因为system2需要很多时间。

所以我想使用查看器窗格使用的功能导出它们,这是一个图像解释我想要的。

enter image description here

这里的代码作为交互式图形的一个例子,这并不意味着我的图表是传单类,我提供它作为一个例子。

library(leaflet)

m <- leaflet() %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addMarkers(lng=174.768, lat=-36.852, popup="The birthplace of R")

这就是我的想法:

function(m,"SaveAs.png")

我需要帮助,我搜索了很多,并花了很多时间试图找到解决方案。

根据这个问题 How to save Leaflet in R map as png or jpg file?

它与我的问题不同,我需要任何交互式图形的通用函数,plotly的函数,但它只适用于情节图,也是使用PhantomJs和我上面提到的PhantomJS太多的问题usshot webshot函数也很慢,Selenium也wkhtmltoimage,我尝试了很多东西。

请注意我需要通用功能或至少查看器正在使用的功能

1 个答案:

答案 0 :(得分:3)

捕获htmlwidgets位图(如传单)的唯一方法是在浏览器上下文中加载它们,捕获一些(或全部)视口并将其写入文件。这是在重量级浏览器上下文中的一个丑陋的往返过程,将内部DOM表示之间的数据编组到HAR(幕后) - 将二进制位编码为base64,将浏览器上下文代理/驱动程序编码为R,将它们从base64编码到内存或文件。

还有一个问题,即保存到文件中的许多HTML小部件并不总是加载到静态文件上下文中(即您需要一个正在运行的Web服务器)。我不知道googleway保存的小部件是否属实,但传单通常是正确的。

对于以下内容,您需要:

  • 弄清楚如何安装devd binary
  • 弄清楚如何使用chrome驱动程序安装selenium(safari驱动程序可能会更快,因为它的js引擎更快)
  • 启动selenium w / chrome驱动程序

玩具示例设置以保存5个小部件:

library(seleniumPipes)
library(leaflet)
library(purrr)
library(devd) # install_github("hrbrmstr/devd")

m <- leaflet() %>%
  addTiles() %>%
  addMarkers(lng=174.768, lat=-36.852, popup="The birthplace of R")

dir.create("/tmp/pages", showWarnings = FALSE)
dir.create("/tmp/pngs", showWarnings = FALSE)

walk(1:5, ~saveWidget(m, file.path("/tmp/pages", sprintf("%x.html", .x))))

启动selenium会话并启动Web服务器:

remDr <- remoteDr(browserName = "chrome", port = 4444L)

proc <- devd_start("/tmp/pages", open_browser = FALSE)

浏览文件并截取屏幕截图:

list.files("/tmp/pages", "*.html$", full.names = FALSE) %>% 
  walk(~{
    print(system.time({
      page_url <- sprintf("http://devd.io:8000/%s", .x)
      out_file <- sprintf("/tmp/pngs/%s.png", .x)
      remDr %>% 
        go(page_url) %>% 
        takeScreenshot(file=out_file)
    }))
  })

你得到:

##  user  system elapsed 
## 0.473   0.082   6.561 
## 0.449   0.083   4.110 
## 0.447   0.073   4.429 
## 0.419   0.068   3.568 
## 0.423   0.085   4.493 

该序列。

如果我们试图抓住pngs&amp;关闭一些takeScreenshot()功能,或者:

list.files("/tmp/pages", "*.html$", full.names = FALSE) %>% 
  map(~{
    print(system.time({
      page_url <- sprintf("http://devd.io:8000/%s", .x)
      out_file <- sprintf("/tmp/pngs/%s.png", .x)
      remDr %>% 
        go(page_url) %>% 
        takeScreenshot(display=FALSE, useViewer=FALSE, returnPNG=TRUE)
    }))
  }) -> pngs

##  user  system elapsed 
## 0.448   0.060   4.801 
## 0.440   0.058   4.894 
## 0.463   0.074   4.857 
## 0.466   0.068   5.010 

不要忘记登上网络服务器:

devd_stop(proc)

通过并行处理可以加快速度,但是其他方式更愿意为您提供免费咨询,特别是因为您不是,而且仍然没有提到您的问题细节。答案主要针对具有类似需求但权利较少的其他人。