【问题标题】:Create a gif from a series of Leaflet maps in R从 R 中的一系列传单地图创建 gif
【发布时间】:2016-02-04 03:48:06
【问题描述】:

我正在寻找一种将leaflet R Studio 绘图转换为图像文件的自动化方法。

似乎将leaflet 小部件导出到HTML 很简单(Saving leaflet output as html)。但是,我找不到任何关于如何将leaflet 小部件生成的图像保存为图像的答案或文档。我可以在 R Studio 中手动执行此操作,但 R Studio 中没有可以调用来执行相同操作的函数,这似乎很奇怪。

我已经尝试了常见的嫌疑人,以下变体:

png("test_png.png")
map
dev.off()

但这些都只是打印白色或打印一个甚至无法打开的文件。如果我正确理解了Git discussion,似乎leaflet 中的某些内容不可用,但用户需要。

与此同时,R Studio 显然有办法将此图像渲染成图像文件,让我按下按钮即可。 有没有办法自动执行此操作?如何将在 R Studio 中绘制的图像导出到图像文件?我需要图像文件,并且我需要它是程序化的,因为我想从几百张地图中制作一个 gif。

或者,我欢迎提出解决方法的建议。我可以试试这个:Python - render HTML content to GIF image 但如果有人有替代建议,请分享。

【问题讨论】:

  • 我在类似情况下所做的是创建所有地图并将它们保存为 html 文件。然后创建另一个 html 文件,该文件将简单地保存一个 iframe 来读取您的地图文件。您必须学习一些 javascript,然后您可以创建一个循环,在 iframe 内循环遍历您的 html 文件以获得临时 gif。不确定这是否适合您的情况,但我想我会把它扔在那里。
  • @brittenb 我过去实际上使用过该解决方案,无论如何它可能适合我想在这里做的事情。这样做的好处是我不会拘泥于 1 个 gif,而是可以随意混合搭配。 p.s.我喜欢你的个人资料;P

标签: r leaflet imagemagick rstudio gif


【解决方案1】:

我一直在尝试结合使用webshot 包和来自htmltools 的saveWidget 来做到这一点,尽管它很慢。对于几百张地图,如果你只是在这里和那里做它可能还不错。但是对于实时应用来说太慢了。

此工作流程需要两个外部应用程序。 webshot 截取网页截图并要求您先安装 PhantomJS(它很小而且很简单)。我还使用ImageMagick(并且需要从命令行访问)来创建.gif 文件,但我确信还有许多其他程序可以用来制作 gif。

这个想法只是在循环中创建地图,将它们保存到带有saveWidget 的临时html 文件中,然后使用webshot 将其转换为png(慢)。然后,一旦你拥有所有的 png,使用 ImageMagick 将它们转换为 gif(快速)。

这是一个例子,我也加载了ggmap,但只是为了获得一个可以放大的位置。

library(webshot)
library(leaflet)
library(htmlwidgets)
library(ggmap)

loc <- geocode('mt everest')  # zoom in everest
zooms <- seq(2,14,3)          # some zoom levels to animate

## Make the maps, this will make some pngs called 'Rplot%02d.png'
## in your current directory
for (i in seq_along(zooms)) {
    m <- leaflet(data=loc) %>%
      addProviderTiles('Esri.WorldImagery') %>%
      setView(lng=loc$lon, lat=loc$lat, zoom=zooms[i])
    if (i==1)
        m <- m %>% addPopups(popup="Going to see Mt Everest")
    if (i==length(zooms))
       m <- m %>%
          addCircleMarkers(radius=90, opacity = 0.5) %>%
          addPopups(popup = 'Mt Everest')

    ## This is the png creation part
    saveWidget(m, 'temp.html', selfcontained = FALSE)
    webshot('temp.html', file=sprintf('Rplot%02d.png', i),
            cliprect = 'viewport')
}

然后,它只是将 png 转换为 gif。我在 Windows 上执行此操作,因此在 mac/linux 上的命令可能略有不同(我认为只是单引号而不是双引号或其他东西)。这些命令来自命令行/shell,但您也可以使用 system/system2 从 R 调用或尝试具有一些 ImageMagick 包装函数的 animation 包。制作一个没有什么花哨的简单 gif 很简单,convert *.png animation.gif。我使用了稍长的代码来使 png 更小/添加一些延迟/并让序列进出。

convert Rplot%02d.png[1-5] -duplicate 1,-2-1, -resize "%50" gif:- | convert - -set delay "%[fx:(t==0||t==4)?240:40]" -quiet -layers OptimizePlus -loop 0 cycle.gif

【讨论】:

  • 很好的答案 - 不错的技术。
  • 哇,非常感谢。我从您的详细回复中学到了很多东西。
【解决方案2】:

您可以按照 jenesaisquoi(第一个答案)的回答创建一系列 PNG 文件。然后使用下面的带有魔法包的代码创建带有 png 文件的 gif。

library(magick)

    png.files <- sprintf("Rplot%02d.png", 1:20) #Mention the number of files to read
GIF.convert <- function(x, output = "animation.gif")#Create a function to read, animate and convert the files to gif
        {
        image_read(x) %>%
        image_animate(fps = 1) %>%
        image_write(output)
        }

        GIF.convert(png.files)

您不需要在 PC 上安装 ImageMagick 软件。

代码链接:Animation.R

【讨论】:

    【解决方案3】:

    我有 3 列的表格:lat、lon、day(376 天)。

    过程是:创建地图->将地图保存为HTML->将地图保存为PNG->导入图片->绘制它(用plot + ggimage)

    所有这些过程,都会在一个循环中进行

    library(leaflet)
    library(animation)
    library(png)
    library(htmlwidgets)
    library(webshot)
    library(ggmap)
    
    saveGIF({
    for (i in 1:376) {
      map  = leaflet() %>%
        addTiles() %>%
        setView(lng = lon_lat[1,2], lat = lon_lat[1,1], zoom = 5)%>%
        addMarkers(lng = lon_lat[lon_lat$day == i,2],lat = lon_lat[lon_lat$day == i,1])
    
      saveWidget(map, 'temp.html', selfcontained = FALSE) ## save the html
      webshot('temp.html', file=sprintf('Rplot%02d.png', 1),cliprect = 'viewport') ## save as png
      img = readPNG("Rplot01.png") ### read the png
      plot(ggimage(img)) ###reading png file
    }
    })
    

    【讨论】:

      猜你喜欢
      • 2013-08-25
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      • 2021-06-08
      • 1970-01-01
      • 2020-08-30
      相关资源
      最近更新 更多