2016-02-20 13 views
5

Zdaję sobie sprawę, że to w dużej mierze celowość stosowania interaktywnego leaflet mapę, ale piszę książkę tradycyjnych papieru i chcę pokazać, w jaki sposób pakiet leaflet dla R działa. Piszę książkę w LaTeX i renderuję z knitr. Czy istnieje sposób na renderowanie mapy w postaci obrazu rastrowego, aby można ją było włączyć do tej książki?renderuj działki z ulotkami jak raster w R?

Oto minimalne przykład:

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

Teraz gdy próbuję kawał jak:

<<>>= 
map 
@ 

otrzymuję ten błąd:

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

Próbując zapisać jako PNG nie działa też:

<<>>= 
png(filename = "test.png") 
map 
dev.off() 
@ 

map nie dziedziczy po ggplot, więc ggsave również nie będzie działać.

Czy istnieje sposób, aby to zadziałało?

+0

jak '' leaflet' dygraph', opiera się na 'htmlwidgets'. Zgodnie z [tą odpowiedzią Yihui] (http://stackoverflow.com/a/31820519/2706569) "nie możesz używać pakietów opartych na htmlwidgets w dokumentach LaTeXa". Ale przeczytaj także komentarze; mogą istnieć obejścia. –

+0

To ma sens - dzięki za link. Najlepszym rozwiązaniem, jakie znalazłem, jest renderowanie w RStudio, a następnie użycie funkcji Eksportuj ... i zapisanie jako PNG. – beanumber

Odpowiedz

7

Nastąpił niedawny pytanie na How to save Leaflet in RStudio map as png or jpg file?. Jeśli nie masz nic przeciwko instalowaniu PhantomJS, poniższy kod powinien pomóc w tworzeniu obrazów statycznych z ulotce (lub MapView) mapach. Pozostaje nam tylko nie pokazywać w książce kodu saveWidget i webshot, a zamiast tego importować i wyświetlać utworzony z niego plik 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") 

Oto niektóre wyjścia LaTeX do celów demonstracyjnych. Jeśli ktokolwiek jest zainteresowany, pełny plik źródłowy .Rnw jest dostępny pod numerem GitHub.

LaTeX

+3

Świetna odpowiedź. Możesz dodać 'knitr :: include_graphics (" leaflet_map.png ")', który jest jedynym dodatkowym kodem wymaganym do użycia twojego podejścia w dokumencie 'knitr'. –

+0

Wy, ludzie, jesteście niesamowici. – beanumber

+0

To wszystko @CL. Lub użyj 'includegraphics' (od ** graphicx **) lub podobnego, bezpośrednio w kodzie LaTeX, tak jak to zrobiłem w pliku źródłowym, który został połączony powyżej. – fdetsch