You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R Leaflet中实现悬停触发的独立信息展示面板?

在Shiny+Leaflet中实现悬停区域显示对应信息

要实现类似JS Leaflet示例的悬停信息面板,核心是监听Leaflet的鼠标悬停事件,动态筛选并展示对应区域的数据。以下是针对你现有代码的修改方案:

关键修改点

  • 给多边形图层添加唯一标识,用于识别悬停的区域
  • 监听鼠标悬停事件,获取当前悬停的区域ID
  • 根据ID动态筛选数据,在面板中显示单条区域信息

修改后的完整代码

ui <- fillPage(tags$head(includeCSS("./shiny/www/styles.css")),
               title = "National Parks I've Visited",
               bootstrap = TRUE,
               leafletOutput("map", width = "100%", height = "100%"),
               absolutePanel(id = "info-panel",
                             class = "panel panel-default",
                             bottom = 75, 
                             left = 55, 
                             width = 250, 
                             fixed = TRUE, 
                             draggable = TRUE, 
                             height = "auto",
                             p(id = "info", class="info-title", "National Park Data"),
                             textOutput("demo_text", container = tags$h3)))

server <- function(input, output) {
  output$map <- renderLeaflet({
    leaflet() %>%
      addPolygons(data = usa_base,
                  smoothFactor = 0.2,
                  fillColor = "#808080",
                  stroke = TRUE,
                  weight = 0.5,
                  opacity = 0.5,
                  color = "#808080",
                  highlightOptions = highlightOptions(
                    weight = 0.5,
                    color = "#000000",
                    fillOpacity = 0.7,
                    bringToFront = FALSE),
                  group = "Base Map") %>%  
      addPolygons(data = nps,
                  smoothFactor = 0.2,                 
                  fillColor =  ~nps_color(type),
                  fillOpacity = 1,
                  stroke = TRUE,
                  weight = 0.2,     
                  opacity = 0.5,                       
                  color = "#354f52",              
                  highlight = highlightOptions(
                    weight = 3,
                    color = "#fff",
                    fillOpacity = 0.8,
                    bringToFront = TRUE),
                  # 新增:给每个公园多边形绑定唯一ID(用公园名称作为标识)
                  layerId = ~PARKNAME,
                  group = "National Parks")  %>%
      addLayersControl(
        baseGroups = "Base Map",
        overlayGroups = "National Parks",
        options = layersControlOptions(collapsed = FALSE))  %>% 
      addLegend(pal = nps_color,
                values = nps$type,
                position = "bottomright",
                title = "National Land by Type")
  })
  
  # 响应鼠标悬停事件,获取当前悬停的公园
  current_park <- reactive({
    req(input$map_shape_mouseover)
    # 根据悬停的layerId筛选对应公园数据
    nps[nps$PARKNAME == input$map_shape_mouseover$id, ]
  })
  
  output$demo_text <- renderText ({
    # 判断是否有悬停的公园,无悬停时显示默认提示
    if (is.null(input$map_shape_mouseover)) {
      "鼠标悬停在公园区域查看详情"
    } else {
      park <- current_park()
      sprintf("%s 是一处%s。我%s去过这里。", park$PARKNAME, park$type, park$visited)
    }
  })
}

代码说明

  • layerId = ~PARKNAME:为每个公园多边形绑定唯一标识,Shiny会通过这个ID识别当前悬停的区域
  • input$map_shape_mouseover:Leaflet在Shiny中自动生成的悬停事件输入,包含当前悬停图层的id(即我们设置的PARKNAME)
  • current_park响应式表达式:实时根据悬停ID筛选对应公园的数据,确保数据随悬停动作动态更新
  • 悬停状态判断:当鼠标未悬停在任何公园区域时,显示友好提示文本,避免出现空值错误

内容的提问来源于stack exchange,提问作者Liz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:10:25