我正在使用 R 编程语言。
使用北卡罗来纳州的内置地图,我生成了 3 个随机变量(收入、孩子数量、体重),然后为此数据创建了地图(使用“传单”库)(通过循环):
library(sf)
library(mapview)
library(leaflet)
library(leafgl)
library(colourvalues)
library(leaflet.extras)
library(magick)
nc <- st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) %>%
st_transform(st_crs(4326)) %>%
st_cast('POLYGON')
set.seed(123)
nc$median_income <- sample(20000:100000, nrow(nc), replace = TRUE)
pal <- colorNumeric(palette = "YlOrRd", domain = nc$median_income)
nc$median_number_of_kids <- sample(0:5, nrow(nc), replace = TRUE)
pal2 <- colorNumeric(palette = "Blues", domain = nc$median_number_of_kids)
nc$median_weight <- rnorm(nrow(nc), mean = 175, sd = 15)
pal3 <- colorNumeric(palette = "Greens", domain = nc$median_weight)
vars <- list(median_income = pal, median_number_of_kids = pal2, median_weight = pal3)
maps <- list()
for (i in seq_along(vars)) {
var <- names(vars)[i]
pal <- vars[[i]]
map <- leaflet(data = nc) %>%
addProviderTiles(providers$OpenStreetMap) %>%
addPolygons(fillColor = ~pal(get(var)),
fillOpacity = 0.8,
weight = 1,
color = "white",
popup = ~NAME,
label = ~NAME) %>%
addLegend(pal = pal,
values = ~get(var),
title = paste("Median", var),
position = "bottomright")
maps[[i]] <- map
}
map_1 <- maps[[1]]
map_2 <- maps[[2]]
map_3 <- maps[[3]]
mapshot(map_1, file = "map_1.png")
mapshot(map_2,file = "map_2.png")
mapshot(map_3, file = "map_3.png")
img1 <- image_read("map_1.png")
img2 <- image_read("map_2.png")
img3 <- image_read("map_3.png")
combined_img <- image_append(c(img1, img2, img3))
print(combined_img)
image_write(combined_img, path = "combined_maps.png", format = "png")
这些地图的外观如下(注意图例):
我现在想将所有这些地图合并到一个文件中,该文件允许用户在不同地图之间“切换” - 我知道如何使用以下代码执行此操作:
combined_map = leaflet(data = nc) %>%
addProviderTiles(providers$OpenStreetMap) %>%
addPolygons(fillColor = ~pal(median_income),
fillOpacity = 0.8,
weight = 1,
color = "white",
popup = ~NAME,
label = ~NAME,
group = "Median Income") %>%
addPolygons(fillColor = ~pal2(median_number_of_kids),
fillOpacity = 0.8,
weight = 1,
color = "white",
popup = ~NAME,
label = ~NAME,
group = "Median Number of Kids") %>%
addPolygons(fillColor = ~pal3(median_weight),
fillOpacity = 0.8,
weight = 1,
color = "white",
popup = ~NAME,
label = ~NAME,
group = "Median Weight (lbs)") %>%
addLayersControl(overlayGroups = c("Median Income", "Median Number of Kids", "Median Weight (lbs)"),
options = layersControlOptions(collapsed = FALSE))
我的问题:代码好像跑了,但是传说却消失了!
我的问题:我试图了解更多关于图例消失的原因以及我可以做些什么来解决这个问题 - 并且我了解到可以将“传单”库与 javascript/html 函数结合起来来修改地图的显示(例如htmlwidgets::onRender("")
). 也许这可能是解决传说消失问题的策略?
或者我是否让一切变得过于复杂并且有更简单的方法来做到这一点?
Thanks!
EDIT 1:我发现了一个类似的帖子在R中的传单地图上的不同图层中添加不同的图例 https://stackoverflow.com/questions/37807770/add-different-legends-in-different-layers-on-leaflet-map-in-r并一直在尝试根据我的问题提供的答案来调整代码 - 也许这也可以解决问题?
combined_map = leaflet(data = nc) %>%
addProviderTiles(providers$OpenStreetMap) %>%
addPolygons(fillColor = ~pal(median_income),
fillOpacity = 0.8,
weight = 1,
color = "white",
popup = ~NAME,
label = ~NAME,
group = "Median Income") %>%
addPolygons(fillColor = ~pal2(median_number_of_kids),
fillOpacity = 0.8,
weight = 1,
color = "white",
popup = ~NAME,
label = ~NAME,
group = "Median Number of Kids") %>%
addPolygons(fillColor = ~pal3(median_weight),
fillOpacity = 0.8,
weight = 1,
color = "white",
popup = ~NAME,
label = ~NAME,
group = "Median Weight (lbs)") %>%
addLegend(pal = pal, values = ~median_income, title = "Median Income", position = "bottomright", group="Median Income") %>%
addLegend(pal = pal2, values = ~median_number_of_kids, title = "Median Number of Kids", position = "bottomright", group="Median Number of Kids") %>%
addLegend(pal = pal3, values = ~median_weight, title = "Median Weight (lbs)", position = "bottomright", group="Median Weight (lbs)") %>%
addLayersControl(overlayGroups = c("Median Income", "Median Number of Kids", "Median Weight (lbs)"),
options = layersControlOptions(collapsed = FALSE))
EDIT 2:根据@Alistaire提供的评论中的建议,我尝试修改代码:
combined_map = leaflet(data = nc) %>%
addProviderTiles(providers$OpenStreetMap) %>%
addPolygons(fillColor = ~pal(median_income),
fillOpacity = 0.8,
weight = 1,
color = "white",
popup = ~NAME,
label = ~NAME,
group = "Median Income") %>%
addPolygons(fillColor = ~pal2(median_number_of_kids),
fillOpacity = 0.8,
weight = 1,
color = "white",
popup = ~NAME,
label = ~NAME,
group = "Median Number of Kids") %>%
addPolygons(fillColor = ~pal3(median_weight),
fillOpacity = 0.8,
weight = 1,
color = "white",
popup = ~NAME,
label = ~NAME,
group = "Median Weight (lbs)") %>%
addLegend(pal = pal, values = ~median_income, title = "Median Income", position = "bottomright", group="Median Income") %>%
addLegend(pal = pal2, values = ~median_number_of_kids, title = "Median Number of Kids", position = "bottomright", group="Median Number of Kids") %>%
addLegend(pal = pal3, values = ~median_weight, title = "Median Weight (lbs)", position = "bottomright", group="Median Weight (lbs)") %>%
addLayersControl(baseGroups = c("Median Income", "Median Number of Kids", "Median Weight (lbs)"),
options = layersControlOptions(collapsed = FALSE))