web-dev-qa-db-fra.com

Changer la couleur du marqueur de la notice

Existe-t-il de toute façon de changer la couleur de la base du marqueur de la brochure sur la valeur d'une variable. Dans la carte suivante, par exemple, je souhaite attribuer une couleur de marqueur basée sur la variable 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))
13
M.Qasim

Pour autant que je sache, vous devez affecter un fichier image à un niveau d'icône. Par exemple, si vous avez trois niveaux de magnitude dans les données sismiques, vous devez créer une liste d'icônes avec trois chemins d'image. Ensuite, vous pouvez avoir trois couleurs différentes dans les marqueurs. Au moins, l'exemple suivant se rapproche de ce que vous voulez. J'ai édité un fichier png et créé trois fichiers png. Vous devez spécifier les chemins du fichier lorsque vous créez une liste d'icônes.

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

enter image description here

12
jazzurro

Celui-ci a fonctionné pour moi:

Source: 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)
11
M.Qasim

J'utilise souvent les marqueurs de cercle parce que vous pouvez changer la taille et la couleur en fonction d'autres variables. Par exemple, j'ai créé une variable groupée à partir d'un continu à l'aide du code suivant:

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

Lorsque vous le tracez, j'utilise le code pour les marqueurs de cercle. Le rayon/la surface du cercle est basé sur la valeur réelle du facteur, puis la couleur est attribuée en fonction des cases.

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') %>%

À la fin de votre code, ajoutez une légende. J'ai ajouté une mise en forme.

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

Cela vous donne des cercles de couleur et de taille basés sur une variable et une légende de Nice.

enter image description here

5
Bryan Butler

Pourquoi ne pas utiliser des marqueurs vectoriels basés sur svg (voici un exemple d'implémentation - https://github.com/hiasinho/Leaflet.vector-markers ) que vous pouvez appliquer n'importe quelle couleur fill tu veux? Au lieu d'avoir à créer une grande quantité de fichiers d'images statiques. Un code impliqué, oui, mais beaucoup plus flexible.

3
snkashis

L.Marker utilise des images (une pour le marqueur, une pour l'ombre) donc ce n'est pas possible. Vous pouvez cependant utiliser vos propres images, il y a une bonne écriture sur le sujet parmi les tutoriels sur le site Leaflet:

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

2
iH8