如何在 R 的 plotly scattermapbox 中使用自定义标记符号

How to use a custom marker symbol in plotly scattermapbox for R

我目前正在开发一个使用交互式地图的闪亮小应用程序。这个想法非常简单:我正在尝试使用 lat/long 坐标在地图中绘制一些点。我不能使用google的API,所以我使用plotly的散点图,指定地图布局。

这是我目前拥有的一般表示:

fig <- plotly::plot_ly(
      data = data,
      lat = data$lat,
      lon = data$long,
      mode = "markers",
      marker = list(size = 10),
      type = 'scattermapbox',
      hovertext = paste0(
        paste0("Some info 1: ", data$field1, "\n"),
        paste0("Some info 2: ", data$field2, "\n"),
        paste0("Some info 3: ", data$field3)
        )
     )

# specify layout as open street map
fig <- fig %>%
      layout(
        mapbox = list(
          style = 'open-street-map',
          zoom = 3,
          center = list(lat = -20.72623, lon = -47.74942))
        ) 
    print(fig)

考虑到我的“数据”数据集有字段和坐标,我得到的结果是这样的:

我无法做的是更改标记符号。根据 plotly 的文档(https://plotly.com/r/reference/#scatter-mode),它就像定义 symbol = "some_symbol" 一样简单,但这是行不通的。我看过一些示例和一些解决方法,但 none 似乎非常直观。

理想情况下,我想生成如下所示的地图:

有谁知道这是否可以通过简单的散点图实现?还有别的办法吗?我在这里遗漏了什么吗?

虽然使用了不同的包,但我找到了解决方案。

使用 leaflet 包,我能够使用相同的 open-street-map 布局创建地图。默认标记 symbol/icon 是一个图钉,但您可以使用 svg 文件创建您想要的任何自定义图标。指定传单文档 here.

我的具体解决方案是将悬停文本定义为一组标签,然后简单地调用 leaflet 对象内的 addMarkers 函数。

labels <- lapply(seq(nrow(data)), function(i) {
      paste0( '<p><b> Some information: ', data[i, "field1"], '</b></p>', 
              "<p> Some other information : ", data[i, "field2"] / 1000, ' MWm </p>', 
              "<p> Some different information : ", data[i, "field3"],'</p>')
    })
    
fig <- leaflet::leaflet(data = data) %>% leaflet::addTiles() %>%
       leaflet::addMarkers(
        ~as.numeric(longitude),
        ~as.numeric(latitude),
        label = lapply(labels, htmltools::HTML)
       )
       print(fig)