Markers weergeven op een leaflet kaart in R Shiny
Hieronder laat ik zien hoe je een kaart toevoegt in Shiny en daar vervolgens markers op plaatst. Vaak moeten gebruikers ook op de marker kunnen klikken, hiervoor heb ik ook voorbeeld gemaakt.
Markers Toevoegen
Voor de basiskaart gebruiken we Leaflet. We maken in de UI een leafletOutput met als naam mymap. In de server gaan we die UI vervolgens vullen door te zeggen dat de mymap output (ouput$mymap) gelijk is aan renderLeaflet en daarin wat code. Die code pakt de met R meegeleverde dataset quakes waarin coördinaten staan van aardbevingen en plot die vervolgens met addMarkers op de kaart. De functie addTiles zorgt ervoor dat de kaart (opgedeeld in stukjes, ook wel tiles genoemd) wordt geladen.
library(shiny) library(leaflet) ui <- fluidPage( titlePanel("Leaflet Markers Voorbeeld met Quakes Dataset"), leafletOutput("mymap") ) server <- function(input, output, session) { output$mymap <- renderLeaflet({ leaflet(quakes) %>% addTiles() %>% addMarkers(~long, ~lat, popup = ~as.character(mag)) }) } shinyApp(ui, server)
Markers Groeperen
Zoals je in het voorbeeld hierboven ziet staan er erg veel markers op de kaart. Leaflet biedt de optie om deze te groeperen. Pas als je inzoomt, krijg je de individuele markers te zien. Hieronder staat de code. Eigenlijk is het enige wat veranderd is het stukje clusterOptions = markerClusterOptions() in de addMarkers functie.
library(shiny) library(leaflet) ui <- fluidPage( titlePanel("Leaflet Markers Voorbeeld met Quakes Dataset"), leafletOutput("mymap") ) server <- function(input, output, session) { output$mymap <- renderLeaflet({ leaflet(quakes) %>% addTiles() %>% addMarkers(~long, ~lat, popup = ~as.character(mag), clusterOptions = markerClusterOptions()) }) } shinyApp(ui, server)
Op Markers Klikken
Vaak wil je dat gebruikers op een marker kunnen klikken. Vervolgens wordt er meer informatie van het betreffende datapunt weergegeven.
In de onderstaande code hebben we in de UI ook een textOutput genaamd info toegevoegd. Om de klik af te vangen doet Leaflet iets speciaals: het maakt zelf de variabele mymap_marker_click aan. Deze variabele wordt gevuld met de informatie over de marker die de gebruiker aan heeft geklikt. Met observeEvent luisteren we of deze variabele van waarde verandert. Als dat zo is (en de gebruiker dus een marker heeft geselecteerd) dan wordt de code die in observeEvent staat uitgevoerd.
In de observeEvent wordt de marker$id opgevraagd. Deze waarde kennen we toe aan elke marker in de addMarker functie met het argument layerId. Het layerId is gelijk aan de rowname van de marker in het originele quakes dataframe. Als we die id hebben, kunnen we de rest van de data van de geselecteerde marker in dat dataframe opzoeken. En dat is precies wat quakes[as.numeric(marker$id), "mag"] doet: de magnitude opvragen van de door de gebruiker geselecteerde marker.
library(shiny) library(leaflet) ui <- fluidPage( titlePanel("Interactieve Leaflet Markers met Quakes Dataset en Clustering"), leafletOutput("mymap"), textOutput("info") ) server <- function(input, output, session) { output$mymap <- renderLeaflet({ leaflet(quakes) %>% addTiles() %>% addMarkers( ~long, ~lat, clusterOptions = markerClusterOptions(), layerId = ~row.names(quakes) ) }) observeEvent(input$mymap_marker_click, { marker <- input$mymap_marker_click info <- paste0("Magnitude: ", quakes[as.numeric(marker$id), "mag"]) output$info <- renderText({ info }) }) } shinyApp(ui, server)
Stel je vraag in de chat!
Ik kan me voorstelen dat je net een specifieke andere vraag hebt die hier niet tussen staat. Stel deze dan vooral via de chat, daar is ‘ie voor! Ik kan niet altijd gelijk antwoorden, maar vaak zie ik de oplossing snel en kan jij weer verder!