Изменить цвет маркера листовки

Можно ли изменить цвет базы маркеров буклета на значение какой-либо переменной. На следующей карте, например, я хочу назначить цвет маркера на основе переменной 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))

Ответ 1

Насколько я знаю, вам нужно назначить файл изображения на один уровень значка. Например, если у вас есть три уровня по величине в данных землетрясения, вам нужно создать список значков с тремя путями изображений. Затем вы можете иметь три разных цвета в маркерах. По крайней мере, следующий пример приближается к тому, что вы хотите. Я отредактировал файл 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])

введите описание изображения здесь

Ответ 2

Этот работал для меня:

Источник: 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)

Ответ 3

Я часто использую круговые маркеры, потому что вы можете изменить размер и цвет в зависимости от других переменных. Например, я создал переменную binned из непрерывного кода, используя следующий код:

# 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)

Когда вы рисуете, я использую код для маркеров круга. Радиус/площадь круга зависит от фактического значения коэффициента, а затем цвет назначается в соответствии с ячейками.

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)

Это дает вам цветные и размерные круги на основе переменной и красивой легенды.

enter image description here

Ответ 4

Почему бы не использовать векторные маркеры на основе svg (вот пример реализации - https://github.com/hiasinho/Leaflet.vector-markers), что вы можете применить любой цвет fill вы хотите? Вместо того, чтобы создавать большое количество файлов статического изображения. Некоторый код, да, но гораздо более гибкий.

Ответ 5

L.Marker использует изображения (один для маркера, один для тени), так что это невозможно. Тем не менее, вы можете использовать свои собственные изображения, там хорошая запись по теме среди учебных пособий на сайте Leaflet:

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