R和Leaflet:如何跨多行排列标签文本

29

假设您拥有以下数据框:

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>' ) ) )
在这种情况下,信息被显示为我所希望的,但是在同一标签内,数据集中每个城市都有一个条目。我该如何使单个城市的文本排列成多行?非常感谢任何帮助。
3个回答

54

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

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

1
这正是我一直在寻找的,看起来非常简单和明显,应该是我自己想到的。只需要对您的代码进行微小的调整,最后一个 ')' 不是必需的。谢谢。 - LuPi
谢谢你提醒我括号的问题...是复制粘贴错误。 - TimSalabim
7
如果“labs”已经是“cities”表格中的一列,那么在2019年您仍然可以使用波浪线格式“addCircles(label = ~HTML(labs), ...)”。另外,“paste(sep = <br/>, ...)”也是一个用于构建多行标签的替代模式(https://rstudio.github.io/leaflet/popups.html)。 - Nate
1
@Nate,你的链接坏了 - 你能修复一下吗?谢谢! - Nova
4
非损坏的链接指向弹出窗口的文档网站。谢谢@Nova!(抱歉,由于年代久远,无法编辑以前的评论) - Nate
3
@Nate的评论真的很有帮助。我不想在我的标签中每行之间留下空格,而<br/>就是答案(而不是使用<p></p>)。 - Nova

5
以下内容同样适用于两个标签:
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

请查看此处获取更多信息。

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


2

@goodyonsen 更多标签可以添加,例如您想要3个标签,在这种情况下添加一个额外的换行符和充分的指定符(例如%g)。 在您的代码中,要将其转换为3个标签(为了举例而添加另一个字符字符串“名称”),您可以执行以下操作:

labels <- sprintf(
  "<strong>%s</strong><br/>%g people / mi<sup>2</sup><br/>%s",
  states$name, states$density, states$name
) %>% lapply(htmltools::HTML)

{{链接1:r}} {{链接2:leaflet}}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接