在R中将leaflet绘图渲染为光栅图?

6
我明白这在很大程度上破坏了使用交互式的leaflet地图的目的,但我正在写一本传统的纸质书,想展示如何使用R的leaflet包。我正在LaTeX中编写该书,并使用knitr进行渲染。有没有办法将leaflet地图呈现为栅格图像,以便将其包含在该书中?
下面是一个最简示例:
library(leaflet)
map <- leaflet() %>%
  addTiles() %>%
  addMarkers(lng = -77.03673, lat = 38.89761)

现在,如果我尝试一个类似以下的代码块:

<<>>=
map
@

我收到了这个错误信息:

Error in validateCssUnit(sizeInfo$width): "\maxwidth" is not a valid CSS unit
(e.g., "100%", "400px", "auto")

尝试保存为PNG也不起作用:
<<>>=
png(filename = "test.png")
map
dev.off()
@

map 不继承于 ggplot,所以 ggsave 也无法使用。

有没有办法让它工作呢?


dygraph 一样,leaflet 也基于 htmlwidgets。根据 Yihui 的这篇回答,“你不能在 LaTeX 文档中使用任何基于 htmlwidgets 的包”。但是请注意评论,可能会有解决方法。 - CL.
有道理--感谢提供链接。我找到的最佳解决方案是在RStudio中渲染,然后使用导出...功能并保存为PNG。 - beanumber
1个回答

8

最近有一个问题如何将RStudio中的Leaflet地图保存为png或jpg文件。如果你不介意安装PhantomJS,下面的代码应该能帮助你从leaflet(或mapview)地图创建静态图像。然后唯一需要做的就是在书中不显示saveWidgetwebshot代码,而是导入并显示从中创建的png文件。

## install 'webshot' package
library(devtools)
install_github("wch/webshot")

## load packages
library(leaflet)
library(htmlwidgets)
library(webshot)

## create map
m <- leaflet() %>%
  addTiles() %>%
  addMarkers(lng = -77.03673, lat = 38.89761)

## save html to png
saveWidget(m, "leaflet_map.html", selfcontained = FALSE)
webshot("leaflet_map.html", file = "leaflet_map.png",
        cliprect = "viewport")

## optionally display image when using knitr
# p <- knitr::include_graphics("leaflet_map.png")

这里是一些LaTeX输出,仅供演示。如果有人感兴趣,完整的.Rnw源文件可以从GitHub获得。

LaTeX


4
好的回答。你可以添加 knitr::include_graphics("leaflet_map.png"),这是在 knitr 文档中使用你的方法所需的唯一附加代码。 - CL.
你们太棒了。 - beanumber
就这样 @CL。或者直接在LaTeX代码中使用includegraphics(来自graphicx)或类似的方法,就像我在上面链接的源文件中所做的那样。 - fdetsch
3
我建议使用 knitr::include_graphics(),因为它不受输出格式(LaTeX、Markdown等)的影响。我还在努力自动化在输出格式不是HTML时拍摄HTML小部件的过程。希望在不久的将来这些事情会更容易。 - Yihui Xie
FYI,这项工作已经在当前的 knitr 开发版本中完成:https://github.com/yihui/knitr/blob/master/NEWS.md - Yihui Xie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接