【问题标题】:addlegend R Leaflet-based-on-user-inputaddlegend R Leaflet-based-on-user-input
【发布时间】:2020-05-20 08:53:43
【问题描述】:

我正在使用 Shiny 的 varSelectInput 函数来显示带有来自 spatialpolygondataframe 的 R Leaflet 的地图,以便通过选择对象的变量来绘制相应变量的地图并更改其颜色。为此,我从条件 varSelectInput 生成了 R 传单的 ColorBin 函数的反应对象。所有这些都在渲染地图时正常工作,因此地图被绘制,更新了图例的颜色和标题。但是,在部署图例 (addLegend) 时,我没有预期的结果,因为它没有显示。我尝试在渲染地图时从反应对象传递参数,就像我使用 addPolygons 函数一样,但我没有达到预期的结果。如下图所示: enter image description here

43/5000 我使用的代码如下:

library(shiny)
library(leaflet)
library(tidyverse)



ssd_map <- leaflet() %>% addProviderTiles("CartoDB.DarkMatter")%>% setView(-8.53, 42.90, zoom = 12) 

ui <- fluidPage(
  titlePanel("Santiago de Compostela"),

  mainPanel(
    varSelectInput(
      inputId = "option",
      label = "Elige la información a representar:",
      data = dataframe1  %>% select(`Población Total`,`Población Masculina`,`Población Femenina`,`Población < 16 años`)
    ),
    leafletOutput("map")
  ))

server <- function(input, output) {



  colorpal <- reactive({

    if(input$option == "Población Total") {
      colorBin("Blues",data$`Población Total`,bins = 5)
    } else if (input$option == "Población Masculina"){
      colorBin("Reds",data$`Población Masculina`,bins = 5)

    } else if (input$option == "Población Femenina"){
      colorBin("Oranges",data$`Población Femenina`,bins = 5)

    } else
      colorBin("Greens",data$`Población < 16 años`,bins = 5)

  })



  leyenda <- reactive({

    if(input$option == "Población Total") {
      data$`Población Total`



    } else if (input$option == "Población Masculina"){
      data$`Población Masculina`

    } else if (input$option == "Población Femenina"){
      data$`Población Femenina`

    } else

      data$`Población < 16 años`
  })






  output$map <- renderLeaflet({
    ssd_map

  })

  observe({

    pal <- colorpal()
    leg <- leyenda()

    leafletProxy("map", data = dat1) %>%
      clearShapes() %>%
      clearControls() %>%
      addPolygons(color = "#444444" ,
                  weight = 1, 
                  smoothFactor = 0.5,
                  opacity = 1.0,
                  fillOpacity = 0.5,
                  popup = ~paste(input$option) ,
                  fillColor = ~pal(eval(as.symbol(input$option))))%>%

      addLegend(position = "topright", pal = pal , values =leg[input$option] ,
                title =  ~paste(input$option)) 



  })
}

shinyApp(ui = ui, server = server)

【问题讨论】:

  • 感谢阿德里安的建议
  • 您好!您是否设法正确添加了图例?我不明白关于图例的建议解决方案中的“if”语句有什么不同......我和你有同样的问题。

标签: r shiny leaflet selectinput


【解决方案1】:

您好,经过多次尝试,我已经达到了这个解决方案:

图书馆(闪亮) 图书馆(传单) 库(leaflet.extras)

load("./Datos.Rdata")

ui

mainPanel(

    selectInput("option", "Option:", 
    choices= c("Población Total","Población Masculina","Población Femenina","Población < 16 años")),
    leafletOutput("map")
))

服务器

colorpal <- reactive({

    if(input$option == "Población Total") {
        colorBin("Blues",dat1$`Población Total`,bins = 5)
    } else if (input$option == "Población Masculina"){
        colorBin("Reds",dat1$`Población Masculina`,bins = 5)

    } else if (input$option == "Población Femenina"){
        colorBin("Oranges",dat1$`Población Femenina`,bins = 5)

    } else
        colorBin("Greens",dat1$`Población < 16 años`,bins = 5)

})




ventana <- reactive({

    if(input$option == "Población Total") {
         paste0("<b>", "Población Total: ", "</b>", as.character(dat1$`Población Total`))
    } else if (input$option == "Población Masculina"){
        paste0("<b>", "Población Masculina: ", "</b>", as.character(dat1$`Población Masculina`))

    } else if (input$option == "Población Femenina"){
        paste0("<b>", "Población Femenina: ", "</b>", as.character(dat1$`Población Femenina`))

    } else
        paste0("<b>", "Población < 16 años: ", "</b>", as.character(dat1$`Población < 16 años`))

})



output$map <- renderLeaflet({


    leaflet() %>% setView(-8.53, 42.90, zoom = 10)%>%
        addBootstrapDependency() %>% 
        # Base groups

        addProviderTiles(providers$CartoDB.DarkMatter , group = "CartoDB.DarkMatter") %>%
        addProviderTiles(providers$Esri.WorldImagery , group = "Esri.WorldImagery") %>%
        addMiniMap(
            tiles = providers$Esri.WorldImagery,
            toggleDisplay = TRUE)

})


observe({

    pal <- colorpal()
    popup1 <-ventana()
    proxy <- leafletProxy("map", data = dat1)
    proxy %>% clearShapes() %>%clearControls()
    if (input$option == "Población Total") {
        proxy %>% addPolygons(color = "#444444" ,
                              weight = 1, 
                              smoothFactor = 0.5,
                              opacity = 1.0,
                              fillOpacity = 0.5,
                              popup = popup1 ,
                              fillColor = ~pal(dat1[[input$option]]))%>% 

            addLegend(position = "topright", pal = pal, values = dat1[[input$option]] ,
                      title =  ~paste(input$option)) }

    else  if (input$option  == "Población Masculina") {

         proxy %>% addPolygons(color = "#444444" ,
                              weight = 1, 
                              smoothFactor = 0.5,
                              opacity = 1.0,
                              fillOpacity = 0.5,
                              popup = popup1 ,
                              fillColor = ~pal(dat1[[input$option]]))%>% 

            addLegend(position = "topright", pal = pal , values = dat1[[input$option]] ,
                      title =  ~paste(input$option)) }

    else  if (input$option  == "Población Femenina") {

        proxy %>% addPolygons(color = "#444444" ,
                              weight = 1, 
                              smoothFactor = 0.5,
                              opacity = 1.0,
                              fillOpacity = 0.5,
                              popup = popup1 ,
                              fillColor = ~pal(dat1[[input$option]]))%>% 

            addLegend(position = "topright", pal = pal , values = dat1[[input$option]] ,
                      title =  ~paste(input$option)) }

    else  

        proxy %>% addPolygons(color = "#444444" ,
                              weight = 1, 
                              smoothFactor = 0.5,
                              opacity = 1.0,
                              fillOpacity = 0.5,
                              popup = popup1 ,
                              fillColor = ~pal(dat1[[input$option]]))%>% 

        addLegend(position = "topright", pal = pal , values = dat1[[input$option]] ,
                  title =  ~paste(input$option)) 

})

}

shinyApp(ui = ui, server = server)

【讨论】:

    猜你喜欢
    • 2022-08-15
    • 2022-12-02
    • 1970-01-01
    • 2019-03-05
    • 2019-05-15
    • 2020-06-12
    • 1970-01-01
    • 2022-11-20
    • 2022-12-01
    相关资源
    最近更新 更多