2016-02-20 26 views
5

我意識到這很大程度上違背了使用交互式leaflet地圖的目的,但我正在編寫一本傳統的紙質書,並且想要展示R的leaflet包的工作原理。我正在用LaTeX寫這本書,並用knitr進行渲染。有沒有辦法將leaflet地圖渲染爲柵格圖像,以便將其包含在本書中?在R中將單張圖呈現爲柵格?

下面是一個小例子:

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也不會工作。

有什麼辦法可以使這項工作?

+0

像'dygraph','leaflet'是基於'htmlwidgets'。根據[Yihui的這個回答](http://stackoverflow.com/a/31820519/2706569)「你不能在LaTeX文檔中使用任何基於htmlwidgets的包」。但也請閱讀評論;可能會有解決方法。 –

+0

這很有道理 - 感謝鏈接。我發現的最佳解決方案是在RStudio中渲染,然後使用導出...功能並保存爲PNG。 – beanumber

回答

7

最近有一個關於How to save Leaflet in RStudio map as png or jpg file?的問題。如果您不介意安裝PhantomJS,下面的代碼應該可以幫助您創建來自小冊子(或地圖視圖)地圖的靜態圖像。剩下要做的唯一事情就是不要在書中顯示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輸出。如果有人有興趣,可以從GitHub獲得完整的.Rnw源文件。

LaTeX

+3

很棒的回答。你可以添加'knitr :: include_graphics(「leaflet_map.png」)',這是在'knitr'文檔中使用你的方法所需的唯一附加代碼。 –

+0

你的人很棒。 – beanumber

+0

就是這樣@CL。或者直接在LaTeX代碼中使用'includegraphics'(來自** graphicx **)或類似的東西,就像我在上面鏈接的源文件中所做的那樣。 – fdetsch