我希望将我的交互式图形保存为png,我可以通过查看器将其导出并将其导出为png但我已经有数千个并且必须自动将它们删除。
有一种方法是使用webshot
包,但我尝试了这种方法并且需要很多时间,因为我想同时保存它们,例如:我使用生成的4000个html图表R并且必须在1分钟的时间间隔内将它们保存为图像,当我使用webshot
时,它需要大约43分钟,因为system2
需要很多时间。
所以我想使用查看器窗格使用的功能导出它们,这是一个图像解释我想要的。
这里的代码作为交互式图形的一个例子,这并不意味着我的图表是传单类,我提供它作为一个例子。
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,我尝试了很多东西。
请注意我需要通用功能或至少查看器正在使用的功能
答案 0 :(得分:3)
捕获htmlwidgets位图(如传单)的唯一方法是在浏览器上下文中加载它们,捕获一些(或全部)视口并将其写入文件。这是在重量级浏览器上下文中的一个丑陋的往返过程,将内部DOM表示之间的数据编组到HAR(幕后) - 将二进制位编码为base64,将浏览器上下文代理/驱动程序编码为R,将它们从base64编码到内存或文件。
还有一个问题,即保存到文件中的许多HTML小部件并不总是加载到静态文件上下文中(即您需要一个正在运行的Web服务器)。我不知道googleway保存的小部件是否属实,但传单通常是正确的。
对于以下内容,您需要:
玩具示例设置以保存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)
通过并行处理可以加快速度,但是其他方式更愿意为您提供免费咨询,特别是因为您不是,而且仍然没有提到您的问题细节。答案主要针对具有类似需求但权利较少的其他人。