【问题标题】:Change color of leaflet marker更改传单标记的颜色
【发布时间】:2015-10-05 02:51:10
【问题描述】:

是否可以根据某个变量的值更改传单标记的颜色。例如,在下面的地图中,我希望根据 mag 变量分配标记颜色:

library(leaflet)

data(quakes)

# Show first 20 rows from the `quakes` dataset
leaflet(data = quakes[1:20,]) %>% addTiles() %>%
  addMarkers(~long, ~lat, popup = ~as.character(mag))

【问题讨论】:

  • 我想知道 Leaflet.awesome-markers plugin v2.0 是否适用于 R?

标签: r leaflet


【解决方案1】:

我经常使用圆形标记,因为您可以根据其他变量更改大小和颜色。例如,我使用以下代码从连续变量中创建了一个分箱变量:

# first cut the continuous variable into bins
# these bins are now factors
last$BeatHomeLvl <- cut(last$BeatHome, 
                        c(0,.5,1,2,3,5,100), include.lowest = T,
                        labels = c('<.5x', '.5-1x', '1-2x', '2-3x', '3-5x','5x+'))

# then assign a palette to this using colorFactor
# in this case it goes from red for the smaller values to yellow and green
# standard stoplight for bad, good, and best
beatCol <- colorFactor(palette = 'RdYlGn', last$BeatHomeLvl)

当您绘制它时,我使用圆形标记的代码。圆的半径/面积基于因子的实际值,然后根据 bin 分配颜色。

m1 <- leaflet() %>%
  addTiles() %>%
  addProviderTiles(providers$OpenStreetMap, group = 'Open SM')  %>%
  addProviderTiles(providers$Stamen.Toner, group = 'Toner')  %>%
  addProviderTiles(providers$Esri.NatGeoWorldMap, group = 'NG World') %>%
  setView(lng = -72, lat = 41, zoom = 8) %>%

      addCircleMarkers(data = Jun, lat = ~Lat, lng = ~Lon,
                       color = ~beatCol(BeatHomeLvl), popup = Jun$Popup,
                       radius = ~sqrt(BeatHome*50), group = 'Home - Jun') %>%

在您的代码末尾添加一个图例。我添加了一些格式。

  addLegend('bottomright', pal = beatCol, values = last$BeatHomeLvl,
            title = 'Compare Home<br>Quote Count to<br>3Mos State Avg',
            opacity = 1)

这为您提供了基于变量和漂亮图例的颜色编码和大小的圆圈。

【讨论】:

  • 你最后一个$BeatTotalLvl是从哪里得到的?
  • 不知道为什么您的回答不是最受好评的。比其他答案更简单明了
  • last$BeatTotalLv 是数据框中最后一个字段;它是通过将连续变量转换为平均值来创建的。
【解决方案2】:

据我所知,您需要将图像文件分配给一级图标。例如,如果地震数据中有三个震级,则需要创建一个包含三个图像路径的图标列表。然后,您可以在标记中使用三种不同的颜色。至少,下面的例子越来越接近你想要的。我编辑了一个 png 文件并创建了三个 png 文件。制作图标列表时需要指定文件的路径。

library(dplyr)
library(leaflet)

mutate(quakes, group = cut(mag, breaks = c(0, 5, 6, Inf), labels = c("blue", "green", "orange"))) -> mydf

### I edit this png file and created my own marker.
### https://raw.githubusercontent.com/lvoogdt/Leaflet.awesome-markers/master/dist/images/markers-soft.png
quakeIcons <- iconList(blue = makeIcon("/Users/jazzurro/Documents/Stack Overflow/blue.png", iconWidth = 24, iconHeight =32),
                       green = makeIcon("/Users/jazzurro/Documents/Stack Overflow/green.png", iconWidth = 24, iconHeight =32),
                       orange = makeIcon("/Users/jazzurro/Documents/Stack Overflow/orange.png", iconWidth = 24, iconHeight =32))


leaflet(data = mydf[1:100,]) %>% 
addTiles() %>%
addMarkers(icon = ~quakeIcons[group])

【讨论】:

  • 感谢您的回答。我想自定义标记的颜色而不是圆圈...github.com/lvoogdt/Leaflet.awesome-markers
  • @M.Qasim 我明白了。我知道如何将不同的标记分配给变量的不同级别。但我不知道如何更改图标的颜色。据我所知,一个图标图像(png文件)分配给一个级别。在我看来,您需要先修改 png 文件的颜色,然后才能在传单中使用它们。
  • @M.Qasim 我更新了我的答案。我认为如果我们想为制造商分配不同的颜色,我们基本上需要自己创建标记的图像文件。请看一看。我希望这会让你继续前进。
【解决方案3】:

这个对我有用:

来源:https://github.com/bhaskarvk/leaflet/blob/master/inst/examples/awesomeMarkers.R

library(leaflet)

icon.glyphicon <- makeAwesomeIcon(icon= 'flag', markerColor = 'blue', iconColor = 'black')
icon.fa <- makeAwesomeIcon(icon = 'flag', markerColor = 'red', library='fa', iconColor = 'black')
icon.ion <- makeAwesomeIcon(icon = 'home', markerColor = 'green', library='ion')

# Marker + Label
leaflet() %>% addTiles() %>%
  addAwesomeMarkers(
    lng=-118.456554, lat=34.078039,
    label='This is a label',
    icon = icon.glyphicon)

leaflet() %>% addTiles() %>%
  addAwesomeMarkers(
    lng=-118.456554, lat=34.078039,
    label='This is a label',
    icon = icon.fa)

leaflet() %>% addTiles() %>%
  addAwesomeMarkers(
    lng=-118.456554, lat=34.078039,
    label='This is a label',
    icon = icon.ion)

# Marker + Static Label using custom label options
leaflet() %>% addTiles() %>%
  addAwesomeMarkers(
    lng=-118.456554, lat=34.078039,
    label='This is a static label',
    labelOptions = labelOptions(noHide = T),
    icon = icon.fa)

【讨论】:

  • 很高兴看到你找到了一个例子。我想知道您的机器上安装了哪个版本的传单包。我无法运行上面的代码,因为我的版本中不存在addAwesomeMarkers()
  • 传单版本 1.0.1.9000。您可能需要删除库中现有的传单目录,因为在现有软件包顶部安装更新首先对我不起作用...
  • 请安装以下内容以获取 addAwesomeMarkers()。 devtools::install_github('bhaskarvk/leaflet')
  • 感谢您的来信。我去做。 :)
【解决方案4】:

为什么不使用基于 svg 的矢量标记(这里是一个示例实现 - https://github.com/hiasinho/Leaflet.vector-markers),您可以应用任何您想要的 fill 颜色?而不必创建大量的静态图像文件。涉及一些代码,是的,但更灵活。

【讨论】:

    【解决方案5】:

    L.Marker 使用图像(一张用于标记,一张用于阴影),所以这是不可能的。但是,您可以使用自己的图片,Leaflet 网站上的教程中有一篇关于该主题的很好的文章:

    http://leafletjs.com/examples/custom-icons.html

    【讨论】:

      猜你喜欢
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多