如何在 Shiny 中集成多个用 Leaflet 制作的等值线图?
How do I integrate multiple choropleth maps made with Leaflet in Shiny?
我在 Leaflet 中创建了三个独立的等值线图,它们都在欧洲各地,使用的是相同的国家/地区。每张等值线图都显示不同类型的比率,并且有两个图层用于 1999 年和 2009 年。
虽然我已经成功地将等值线图单独集成到带有年份图层的 Shiny 中,但我希望能够只有一个带有下拉栏的 Shiny 地图,以便在三个不同的等值线图之间单击,同时仍然保留我的每张地图的图层。
谁能建议怎么做?
您可以为此使用 leafletProxy。我稍微修改了 here 中的示例,以更好地满足您的要求。希望这对您有所帮助!
library(shiny)
library(leaflet)
ui <- bootstrapPage(
tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
leafletOutput("map", width = "100%", height = "100%"),
absolutePanel(top = 10, right = 10,
selectInput("maptype", "Map type: ",
choices = c("map 1", "map 2", "map 3")
)
)
)
server <- function(input, output, session) {
# Reactive expression for the data subsetted to what the user selected
filteredData <- reactive({
if(input$maptype=="map 1") return(quakes[sample(1:nrow(quakes),50,replace=TRUE),])
if(input$maptype=="map 2") return(head(quakes,50))
if(input$maptype=="map 3") return(tail(quakes,50))
})
output$map <- renderLeaflet({
leaflet(quakes) %>% addTiles() %>%
fitBounds(~min(long), ~min(lat), ~max(long), ~max(lat))
})
observe({
leafletProxy("map", data = filteredData()) %>%
clearShapes() %>%
addCircles(radius = ~10^mag/10, weight = 1, color = "#777777", fillOpacity = 0.7, popup = ~paste(mag)
)
})
}
shinyApp(ui, server)
我在 Leaflet 中创建了三个独立的等值线图,它们都在欧洲各地,使用的是相同的国家/地区。每张等值线图都显示不同类型的比率,并且有两个图层用于 1999 年和 2009 年。
虽然我已经成功地将等值线图单独集成到带有年份图层的 Shiny 中,但我希望能够只有一个带有下拉栏的 Shiny 地图,以便在三个不同的等值线图之间单击,同时仍然保留我的每张地图的图层。
谁能建议怎么做?
您可以为此使用 leafletProxy。我稍微修改了 here 中的示例,以更好地满足您的要求。希望这对您有所帮助!
library(shiny)
library(leaflet)
ui <- bootstrapPage(
tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
leafletOutput("map", width = "100%", height = "100%"),
absolutePanel(top = 10, right = 10,
selectInput("maptype", "Map type: ",
choices = c("map 1", "map 2", "map 3")
)
)
)
server <- function(input, output, session) {
# Reactive expression for the data subsetted to what the user selected
filteredData <- reactive({
if(input$maptype=="map 1") return(quakes[sample(1:nrow(quakes),50,replace=TRUE),])
if(input$maptype=="map 2") return(head(quakes,50))
if(input$maptype=="map 3") return(tail(quakes,50))
})
output$map <- renderLeaflet({
leaflet(quakes) %>% addTiles() %>%
fitBounds(~min(long), ~min(lat), ~max(long), ~max(lat))
})
observe({
leafletProxy("map", data = filteredData()) %>%
clearShapes() %>%
addCircles(radius = ~10^mag/10, weight = 1, color = "#777777", fillOpacity = 0.7, popup = ~paste(mag)
)
})
}
shinyApp(ui, server)