tmap v4中tm_facets的as.layers=TRUE是否被禁用?代码适配咨询
tmap v4中tm_facets的as.layers参数相关问题
问题描述
之前在tmap v3中,可通过tm_facets()的as.layers参数实现两种地图效果:
as.layers = FALSE:生成各省份的网格分面地图as.layers = TRUE:将每个省份作为独立图层添加到交互式地图中
原实现代码如下:
library(tmap) library(sf) data(NLD_muni) # 各省份的网格分面地图 tmap_mode("view") tm_shape(NLD_muni) + tm_polygons("employment_rate") + tm_facets("province", as.layers = FALSE) # 每个省份作为独立图层的地图 tmap_mode("view") tm_shape(NLD_muni) + tm_polygons("employment_rate") + tm_facets("province", as.layers = TRUE)
疑问:tmap v4中是否已禁用tm_facets的as.layers = TRUE选项?这是bug还是需要更新代码来实现原有效果?
解答
tmap v4确实移除了tm_facets()中的as.layers参数,这不是bug,属于版本迭代后的API调整,需要更新代码来实现原有效果:
1. 生成各省份的网格分面地图(对应原as.layers = FALSE)
tmap v4中tm_facets()默认就是网格分面模式,直接指定分面字段即可:
library(tmap) library(sf) data(NLD_muni) tmap_mode("view") tm_shape(NLD_muni) + tm_polygons("employment_rate") + tm_facets(by = "province")
2. 生成每个省份作为独立交互式图层的地图(对应原as.layers = TRUE)
需要通过拆分数据并逐个添加图层的方式实现,以下是两种可行方案:
方案一:基础循环实现
library(tmap) library(sf) data(NLD_muni) tmap_mode("view") # 按省份拆分空间数据 province_sf_list <- split(NLD_muni, NLD_muni$province) # 初始化地图对象 interactive_map <- tm_shape(province_sf_list[[1]]) + tm_polygons("employment_rate", name = names(province_sf_list)[1]) # 循环添加剩余省份图层 for (i in seq_along(province_sf_list)[-1]) { interactive_map <- interactive_map + tm_shape(province_sf_list[[i]]) + tm_polygons("employment_rate", name = names(province_sf_list)[i]) } interactive_map
方案二:用purrr包简化代码
library(tmap) library(sf) library(purrr) data(NLD_muni) tmap_mode("view") # 拆分数据并批量添加图层 split(NLD_muni, NLD_muni$province) %>% reduce( .f = function(map_obj, sf_data) { map_obj + tm_shape(sf_data) + tm_polygons("employment_rate", name = unique(sf_data$province)) }, .init = tm_shape(NLD_muni[0,]) + tm_polygons() # 初始化空地图 )
内容的提问来源于stack exchange,提问作者Uziel Gonzalez Gonzalez
相关产品推荐
相关产品推荐

