2016-06-16 41 views
8

Ho un'app R Shiny che utilizza Leaflet per creare una mappa interattiva. Su questa mappa, una variabile categoriale viene utilizzata per designare diversi tipi di punti e viene visualizzata utilizzando marcatori personalizzati (icone diverse, a seconda del livello di fattore).Legenda Leaflet per marcatori personalizzati in R

Quello che mi piacerebbe fare è aggiungere una legenda alla trama, ma fare in modo che la legenda mostri le varie icone dei marcatori invece dei colori a tinta unita. Il legends tutorial non copre questo.

Mi sono imbattuto in un altro SO answer that seems to solve this - ma è stato fatto in JavaScript e non sono sicuro di come tradurlo/se può essere tradotto per funzionare in R. Qualcuno sa come realizzare questo?

Un esempio riproducibile di base:

library(leaflet) 

# Sample Data 
data(quakes) 
quakes <- quakes[1:10,] 

# Choose Icon: 
leafIcons <- icons(
    iconUrl = ifelse(quakes$mag < 4.6, 
        "http://leafletjs.com/docs/images/leaf-green.png", 
        "http://leafletjs.com/docs/images/leaf-red.png" 
), 
    iconWidth = 38, iconHeight = 95, 
    iconAnchorX = 22, iconAnchorY = 94) 

# Produce Map: 
leaflet(data = quakes) %>% addTiles() %>% 
    addMarkers(~long, ~lat, icon = leafIcons) 
+0

Se funziona, il modo più semplice è probabilmente solo a fonte il JavaScript. – alistaire

risposta

4

Mentre l'uso di icone è not currently implemented in addLegend(), Yihui suggerito l'uso di AddControl(), usando RAW HTML - che funziona perfettamente!

library(leaflet) 

# Sample Data 
data(quakes) 
quakes <- quakes[1:10,] 

# Choose Icon: 
leafIcons <- icons(
    iconUrl = ifelse(quakes$mag < 4.6, 
        "http://leafletjs.com/docs/images/leaf-green.png", 
        "http://leafletjs.com/docs/images/leaf-red.png" 
), 
    iconWidth = 38, iconHeight = 95, 
    iconAnchorX = 22, iconAnchorY = 94) 

html_legend <- "<img src='http://leafletjs.com/docs/images/leaf-green.png'>green<br/> 
<img src='http://leafletjs.com/docs/images/leaf-red.png'>red" 

# Produce Map: 
leaflet(data = quakes) %>% addTiles() %>% 
    addMarkers(~long, ~lat, icon = leafIcons) %>% 
    addControl(html = html_legend, position = "bottomleft") 

che produce:

Leaflet Map with Categorical Legend

+0

Ho provato questo e funziona ma le icone nella legenda sono molto grandi. C'è un modo per ridimensionarle nel codice html_legend o addControl()? – wraymond

+0

Sì, la dimensione dell'icona è definita nella chiamata a icone(), in quanto sopra sono impostati su 38 px di larghezza e 95 px di altezza. –

2

Risposta al commento di cui sopra: è possibile modificare la dimensione delle icone nella leggenda, a prescindere dalla dimensione iniziale si definisce. Tutto quello che devi fare è aggiungere

style='width:(desired_width)px;height:(desired_height)px'; alla parte HTML.

In particolare, il codice vorrebbe:

library(leaflet) 

# Sample Data 
data(quakes) 
quakes <- quakes[1:10,] 

# Choose Icon: 
leafIcons <- icons(
iconUrl = ifelse(quakes$mag < 4.6, 
       "http://leafletjs.com/docs/images/leaf-green.png", 
       "http://leafletjs.com/docs/images/leaf-red.png" 
), 
    iconWidth = 38, iconHeight = 95, 
    iconAnchorX = 22, iconAnchorY = 94) 

html_legend <- "<img src='http://leafletjs.com/docs/images/leaf-green.png' 
style='width:10px;height:10px;'>green<br/> 

<img src='http://leafletjs.com/docs/images/leaf-red.png' 
style='width:10px;height:10px;'>red" 

# Produce Map: 
leaflet(data = quakes) %>% addTiles() %>% 
addMarkers(~long, ~lat, icon = leafIcons) %>% 
addControl(html = html_legend, position = "bottomleft")