【问题标题】:R and Leaflet: How to arrange label text across multiple linesR 和 Leaflet:如何跨多行排列标签文本
【发布时间】:2025-12-07 22:30:02
【问题描述】:

假设你有以下数据框:

cities = data.frame( name = c('Madrid','Barcelona','Sevilla'),
                 country = c('Spain','Spain','Spain'),
                 region = c('Comunidad de Madrid','Cataluña','Andalucia'),
                 data = c(100, 200, 300), 
                 lng = c(-3.683333,2.166667,-6.083333),
                 lat = c(40.433333,41.383333,37.446667))

我的想法是制作这些城市的地图和标签,当悬停在相应的城市圈时可以显示一些相关信息。我想让标签文本分几行排列。下面的第一种方法失败了:

library( leaflet )

map = leaflet( cities ) %>%
addTiles() %>%
addCircles( lng = ~lng, lat = ~lat, fillColor = 'darkBlue', radius = 10000, 
          stroke = FALSE, fillOpacity = 0.8, label = paste0( cities$name,'\n', cities$region, '\n', cities$country, '\n', cities$data ) )

以及其他类似的尝试。谷歌搜索了一段时间后,我通过 htmltools 包找到了一个可能的解决方案:

library( htmltools )
map2 = leaflet( cities ) %>%
addTiles() %>%
addCircles( lng = ~lng, lat = ~lat, fillColor = 'darkBlue', radius = 10000, 
          stroke = FALSE, fillOpacity = 0.8, 
          label = HTML( paste0( '<p>', cities$name, '<p></p>', cities$region, ', ', cities$country,'</p><p>', cities$data, '</p>' ) ) )

在这种情况下,信息会按我的意愿显示,但在同一个标​​签中,数据集的每个城市都有一个条目。如何将单个城市的文本排列成多行?任何帮助将不胜感激

【问题讨论】:

    标签: r leaflet


    【解决方案1】:

    首先,为每个城市创建一个 html 内容的字符向量,然后将其包装在 lapply 调用中以设置 HTML 属性以便在 adCircles 中定义 label 属性时正确显示

    labs <- lapply(seq(nrow(cities)), function(i) {
      paste0( '<p>', cities[i, "name"], '<p></p>', 
              cities[i, "region"], ', ', 
              cities[i, "country"],'</p><p>', 
              cities[i, "data"], '</p>' ) 
    })
    
    map2 = leaflet( cities ) %>%
      addTiles() %>%
      addCircles(lng = ~lng, lat = ~lat, fillColor = 'darkBlue', radius = 10000, 
                  stroke = FALSE, fillOpacity = 0.8,
                  label = lapply(labs, htmltools::HTML))
    
    map2
    

    【讨论】:

    • 这正是我一直在寻找的东西,看起来如此简单明了,我应该自己想到它。只需对您的代码稍作调整即可,不需要最后一个“)”。谢谢。
    • 2019 年,如果labs 已经是cities 中的一列,您可以继续使用~ 模式addCircles(label = ~HTML(labs), ...),同时paste(sep = &lt;br/&gt;, ...) 是多行的另一种标签构建模式(rstudio.github.io/leaflet)/popups.html)
    • @Nate,您的链接已损坏-您能修复吗?谢了!
    • documentation website for popup 的完整链接。谢谢@Nova! (抱歉,由于年龄原因无法编辑之前的评论)
    • @Nate 的评论对我很有帮助。我不希望标签中单独的行之间有空格,而&lt;br/&gt; 是答案(而不是&lt;p&gt;&lt;/p&gt;)。
    【解决方案2】:

    以下也适用于两个标签:

    labels <- sprintf(
      "<strong>%s</strong><br/>%g people / mi<sup>2</sup>",
      states$name, states$density
    ) %>% lapply(htmltools::HTML)
    
    m <- m %>% addPolygons(
      fillColor = ~pal(density),
      label = labels,
      labelOptions = labelOptions(
        style = list("font-weight" = "normal", padding = "3px 8px"),
        textsize = "15px",
        direction = "auto"))
    
    m
    
    

    请参阅here 了解更多信息。

    p.s:我想将它用于三个标签,但无法做到。

    【讨论】: