将带有底图的tmap保存为图片?

9

我使用tmap在R中创建了一张地图,并添加了底图,想要将其保存为图片。

但每当我使用tmap_save保存成.png格式时,就会丢失底图。

很可能是因为底图只能在查看模式下可见,而不是在绘制模式下可见。

有没有一种好的方法可以将含有底图的地图保存成图片呢?

我有一个变通方案,即先将其保存为HTML,但这并不是一个很好的解决办法。


如果您提供一个我们可以访问的带有数据的示例,那么我们帮助您会更容易。我曾经遇到过类似的问题,但最终我使用了ggplot进行绘图和ggmap获取底图。但如果能在tmap中实现,我会很感兴趣。 - see24
2个回答

9

我在尝试创建静态地图时遇到了类似的问题。经过尝试,发现使用tmaptools::read_osm函数可以解决这个问题。以下是三个地图的可复现示例:

  • map_a看起来不错,但保存后出现问题
  • map_b看起来一点也不好
  • map_c看起来很好,保存后也没有问题

在交互视图中创建一个示例地图。但在保存的文件中,底图并未出现。

library(tmaptools) 
library(tmap)
data(metro)

tmap_mode("view")
map_a <- tm_basemap("OpenStreetMap.Mapnik") +
  tm_shape(metro) +
  tm_bubbles(size = "pop2020", col = "red") 
map_a
tmap_save(map_a, filename="map_a.png")

尝试创建一个类似的地图作为绘图,但底图不会出现,红点浮动而没有地图。
tmap_mode("plot")
map_b <- tm_basemap("OpenStreetMap.Mapnik") +
  tm_shape(metro) +
  tm_bubbles(size = "pop2020", col = "red") 
map_b
tmap_save(map_b, filename="map_b.png")

这里有一个解决方案:使用read_osm。地图底图会显示并可以保存。
c_osm <- tmaptools::read_osm(bb(metro), ext = 1.05)
map_c <- tm_shape(c_osm) +
  tm_rgb() +
  tm_shape(metro) + 
  tm_bubbles(size = "pop2020", col = "red") 
map_c
tmap_save(map_c, filename="map_c.png")

1
我刚刚运行了代码。在第三个选项上遇到了一个错误,但通过在处理read_osm之前添加对“bb”的调用来解决了它。除此之外,气泡似乎已经渲染出来了。我还尝试了@rm1104发布的解决方案中提供的mapshot()选项,并且它对我有效。 - Aran
他的最后一个解决方案很棒! - Marcel Campion

7

另一种选择是将 tmap对象保存为leaflet对象,然后使用mapview包中的mapshot()函数将其保存为图像。以下是一个示例。

library(mapview)
#May need this for mapshot to work
#webshot::install_phantomjs()

data("World")

map <- tm_basemap(leaflet::providers$Esri.WorldTopoMap) + 
tm_shape(World) + tm_polygons(alpha = 0,border.col = "black", lwd = 2)

lf <- tmap_leaflet(map)
mapshot(lf, file = "world_map.png")

mapview::mapshot(lf, file = "world_map.png") Could not load c:%5CUsers%5CKSER~1%5CAppData%5CLocal%5CTemp%5C4%5CRtmpYFNniB%5Cfile5fc82aa164bf.html Error in (function (url = NULL, file = "webshot.png", vwidth = 992, vheight = 744, : webshot.js returned failure value: 1 - 89_Simple
我在执行此操作时遇到了上述错误。 - 89_Simple

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