代码之家  ›  专栏  ›  技术社区  ›  Wilcar

基于传单圆圈的绘图数据(闪亮)

  •  3
  • Wilcar  · 技术社区  · 7 年前

    我的数据

    # Fake data
     df <- data.frame(lng = c(-5, -5, -5, -5, -15, -15, -10),
                 lat = c(8, 8, 8, 8, 33, 33, 20),
                 year = c(2018, 2018, 2018, 2017, 2017, 2017, 2016),
                 type = c('A', 'A', 'A', 'A', 'B', 'B', 'A'),
                 id =c("1", "1", "1", "1", "2", "2", "3"),
                 place =c("somewhere1", "somewhere1", "somewhere1", "somewhere1", "somewhere3", "somewhere2", "somewhere3"),
                 stringsAsFactors = FALSE)
    

    映射我的数据:

    我的用户界面侧:

    ui <- bootstrapPage(
    tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
     leafletOutput("map", width = "100%", height = "100%"),
     absolutePanel(top = 10, right = 10,
                style="z-index:500;", # legend over my map (map z = 400)
                tags$h3("map"), 
                sliderInput("periode", "Chronology",
                            min(df$year),
                            max(df$year),
                            value = range(df$year),
                            step = 1,
                            sep = ""
                ),
    
                checkboxGroupInput("choice", 
                                   "type", 
                                   choices = list("type A" = "A", 
                                                  "type B" = "B"),
                                   selected = 1))
     # todo plot()
    )
    

    我的服务器端:

     server <- function(input, output, session) {
    
     # reactive filtering data from UI
    
       reactive_data_chrono <- reactive({
         df %>%
           filter(year >= input$periode[1] & year <= input$periode[2]) %>%
           filter(type %in% input$choice) %>%
           count(place,lng, lat, type, id) %>%
           arrange(desc(n))
       })
    
     # colors 
    
       pal <- colorFactor(
         palette = c('red', 'blue'),
         domain = df$type
       )
    
     # static backround map
    
       output$map <- renderLeaflet({
         leaflet(df) %>%
           addTiles() %>%
           fitBounds(~min(lng), ~min(lat), ~max(lng), ~max(lat))
       })  
    
      # reactive circles map
    
       observe({
         leafletProxy("map", data = reactive_data_chrono()) %>%
           clearShapes() %>%
           addCircles(lng=~lng,
                      lat=~lat,
                      weight = 5,
                      radius = ~(n*50000),
                      color = ~pal(type)) 
                })  
            }
    

    使用ui&server:

     shinyApp(ui, server)
    

    我的地图:

    enter image description here

    我所做的:
    1。将数据帧ID值分配给圆(层ID)。
    2。得到 id 基于圆单击的值。

    我想要的:
    三。根据单击事件值筛选我的df值。
    4。在绝对面板中绘制X,Y图(n,year)。

    示例:绘图ID==1

    enter image description here

    我在服务器端的尝试: 我有点困惑,A试图调整几个问题,比如 Map Marker in leaflet shiny (@symbolixau answer)到leaftleproxy circles层(而不是backround map)

             server <- function(input, output, session) {
    
              # reactive filtering data from UI
    
                reactive_data_chrono <- reactive({
              df %>%
              filter(year >= input$periode[1] & year <= input$periode[2]) %>%
              filter(type %in% input$choice) %>%
              count(place,lng, lat, type, id) %>%
              arrange(desc(n))
       })
    
     # colors 
    
         pal <- colorFactor(
         palette = c('red', 'blue'),
         domain = df$type
       )
    
     # static backround map
    
       output$map <- renderLeaflet({
       leaflet(df) %>%
          addTiles() %>%
          fitBounds(~min(lng), ~min(lat), ~max(lng), ~max(lat))
       })  
    
       # reactive circles map
    
       observe({
         leafletProxy("map", data = reactive_data_chrono()) %>%
           clearShapes() %>%
           addCircles(lng=~lng,
                      lat=~lat,
                      weight = 5,
                      radius = ~(n*50000),
                      color = ~pal(type),
                      layerId = ~id) ### Assigning df id to layerid
           })  
    
    
      observe circles from leafletProxy "map"
      #############################################  
        observe({
          leafletProxy("map") %>% clearPopups()
          event <- input$map_shape_click
          print(event)
    
    
      # print(event) returns $id in console
    
      #############################################
      # what I want : filtering and plotting 
      # using dplyr not woeking
      ############################################# 
    
          x <- df[df$id == event$id, ]
          x2 <- xtabs(formula =place~year, x)
          output$plot <- renderPlot({x2})
          })
     }
    
    
       })
     }
    

    用户界面添加

             plotOutput(outputId =  "plot"))
    
     shinyApp(ui, server)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   SymbolixAU Adam Erickson    7 年前

    我终于找到了我问题的答案。这是完整的代码。 基于@symbolxau的建议。

          library(shiny)
          library(leaflet)
          library(dplyr)
          library(leaflet)
    
          # Fake data
          df <- data.frame(lng = c(-5, -5, -5, -5, -15, -15, -10),
                           lat = c(8, 8, 8, 8, 33, 33, 20),
                           year = c(2018, 2018, 2018, 2017, 2017, 2017, 2016),
                           type = c('A', 'A', 'A', 'A', 'B', 'B', 'A'),
                           id =c(1, 1, 1, 1, 2, 2, 3),
                           place =c("somewhere1", "somewhere1", "somewhere1", "somewhere1", "somewhere3", "somewhere2", "somewhere3"),
                           stringsAsFactors = FALSE)
    

    用户界面

          ui <- bootstrapPage(
            tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
            leafletOutput("map", width = "100%", height = "100%"),
            absolutePanel(top = 10, right = 10,
                          style="z-index:500;", # legend over my map (map z = 400)
                          tags$h3("map"), 
                          sliderInput("periode", "Chronology",
                                      min(df$year),
                                      max(df$year),
                                      value = range(df$year),
                                      step = 1,
                                      sep = ""
                          ),
    
                          checkboxGroupInput("choice", 
                                             "type", 
                                             choices = list("type A" = "A", 
                                                            "type B" = "B"),
                                             selected = 1),
                          plotOutput(outputId =  "plot"))
          )
    

    服务器

          server <- function(input, output, session) {
    
            # reactive filtering data from UI
    
            reactive_data_chrono <- reactive({
              df %>%
                filter(year >= input$periode[1] & year <= input$periode[2]) %>%
                filter(type %in% input$choice) %>%
                count(place,lng, lat, type, id) %>%
                arrange(desc(n))
            })
    
            # colors
            pal <- colorFactor(
              palette = c('red', 'blue'),
              domain = df$type
            )
    
            # static backround map
            output$map <- renderLeaflet({
              leaflet(df) %>%
                addTiles() %>%
                fitBounds(~min(lng), ~min(lat), ~max(lng), ~max(lat))
            })  
    
            # reactive circles map
            observe({
              leafletProxy("map", data = reactive_data_chrono()) %>%
                clearShapes() %>%
                addCircles(lng=~lng,
                           lat=~lat,
                           weight = 5,
                           radius = ~(n*50000),
                           color = ~pal(type), 
                           layerId = ~id) # Assigning df id to layerid
            })  
    
            # Observe circles from leafletProxy "map"
            observe({
              leafletProxy("map") %>% clearPopups()
              event <- input$map_shape_click
              if (is.null(event))
                return()
              print(event) # Show values on console fort testing
    
              # Filtering and plotting
              x <- df[df$id == event$id, ]
              x2 <- x %>%
                count(id, year)
              output$plot <- renderPlot({plot(x2$n, x2$year)
              })
            })
          }
    
          shinyApp(ui, server)
    
    推荐文章