2015-06-04 13 views
7

Wenn ich versuche, einer Leaflet-Map für eine Leaflet-Map (mit dem Leaflet for R-Paket) in einer Shiny-App eine Legende hinzuzufügen, werden in der Legende die Farben nicht angezeigt der Farbpalette. Stattdessen werden nur die für die NA-Werte angegebenen Farben angezeigt, in diesem Fall Weiß.Leaflet-Kartenlegende in R Shiny App hat keine Farben

legend without colors

Die Anwendung geschieht Folgendes:

  • Erstens, es filtert eine Reihe von Daten basierend auf Benutzereingaben
  • Dann erzeugt er eine Choroplethenkarte aus den gefilterten Daten

Dies ist der Code, den ich verwendet habe, um die Legende zu machen:

addLegend(position = "bottomleft", 
    pal = pal, values = shp.data()$stat.selected, 
    title = "Legend", 
    opacity = .5) 

Wo pal ist eine Quantil-Farbpalette, wie folgt

pal <-colorQuantile(c("#B2FF66","#66CC00","#4C9900","#336600","#193300"), 
        NULL, n = 5, na.color="#FFFFFF") 

shp.data() ein reaktiver Ausdruck ist, dass eine Formdatei, basierend auf Benutzereingaben, gefiltert und stat_selected ist die spezifische Statistik, die der Benutzer zur Abbildung auf Farben auswählt.

Ich erhalte die folgenden Warnungen:

Warning in is.na(x) : 
    is.na() applied to non-(list or vector) of type 'NULL' 
Warning in is.na(values) : 
    is.na() applied to non-(list or vector) of type 'NULL' 

ich zunächst versucht, die Legende nach dem Beispiel auf dem Merkblatt für R-Seite zu machen und verwenden das Argument values = ~stat.selected für die addLegend Funktion, aber ich habe diesen Fehler:

+1

Von der Hilfeseite: Wenn NULL, dann Immer wenn die resultierende Farbfunktion aufgerufen wird, repräsentiert der x-Wert die Domäne. Dies bedeutet, dass die Codierung zwischen Werten und Farben möglicherweise nicht konsistent ist, wenn die Funktion mehrmals aufgerufen wird. Wenn Konsistenz erforderlich ist, müssen Sie eine Nicht-NULL-Domäne angeben. Vielleicht hilft die Änderung der NULL? – ytk

Antwort

2

Ich konnte die Farben zeigen, indem ich die Art, wie ich auf die Werte-Spalte in den Argumenten der AddLegend-Funktion verwiesen habe, änderte. Ich legte die stat.selected Variable in doppelten eckigen Klammern, die das Problem zu beheben schienen:

addLegend(position = "bottomleft", 
      pal = pal, values = shp.data()[[stat.selected]], 
      title = "Legend", 
      opacity = 1 
     ) 

Zur Verdeutlichung des stat.selected Variable kommt aus der folgenden Switch-Anweisung:

stat.selected <- isolate(switch(input$var.stat, 
           "Total employment" = "tot_emp", 
           "Mean annual wage" = "a_mean", 
           "Mean hourly wage" = "h_mean", 
           "Location quotient" = "loc_quotient" 
) 

wo "tot_emp", "a_mean", "h_mean", und "loc_quotient" sind Spaltennamen in dem räumlichen Datenrahmen shp.data.

Ich vermute das Problem war, dass ich versuchte, den Spaltennamen durch Variable mit einem $ übergeben.

Ich bin immer noch ein ziemlich Neuling R Benutzer, also wenn jemand erklären kann, warum das Beispiel in der Broschüre für R Dokumentation in diesem Fall nicht funktioniert, würde ich es begrüßen.

8

Früher hatte ich nur ein einfaches Snippet, das zeigte, wie man Legenden hinzufügt. Ich habe die ~ vor den Legendenwerten nicht benutzt, wie es die Norm ist. Ich habe die traditionelle Dataframe $ -Spalte gemacht und es funktioniert gut.

Dies wird jetzt aktualisiert, um zu sehen, wie alles zusammenpasst. Hier ist ein vollwertiger Mapping-Lauf nach dem Erstellen aller variablen Schnitte usw.Der zuletzt bereinigte Datenrahmen wurde zipData genannt.

# create a full popup 
# add some HTML for editing the styles 

zipData$popUp <- paste('<strong>',zipData$Street, '</strong><br>', 
         'TIV = $',prettyNum(zipData$tiv, big.mark = ',',preserve.width = 'none'), '<br>', 
         'City: ', zipData$city, '<br>', 
         'YrBuilt = ', zipData$YearBuilt, '<br>', 
         'Construction = ', zipData$ConstructionCode, '<br>', 
         'Occupancy = ', zipData$OccupancyCode, '<br>', 
         'Premium = $' , prettyNum(zipData$Premium, big.mark = ',',preserve.width = 'none') , '<br>', 
         'GrossArea = ', prettyNum(zipData$GrossArea, big.mark = ',', preserve.width = 'none'), '<br>', 
         'RoofYr = ', zipData$RoofYearBuilt, '<br>') 

# set color scale for key factor 
colorsConst <- colorFactor(rainbow(4), zipData$ConstructionCode) 

# color scales for numerical bins 
colorstivValue <- colorFactor(palette = 'Accent', zipData$tivValueLvl) 
colorsYrBuilt <- colorFactor(palette = 'Spectral', zipData$yrBuiltLvl) 
colorsRoofYrBuilt <- colorFactor(palette = "YlOrRd", zipData$roofYrBuiltLvl) 


# begin the leaflet map construction 
# create the map opbject 

m <- leaflet() %>% 
    addTiles() %>% 

# add different tiles for different color schemes 

    addProviderTiles(providers$OpenStreetMap, group = 'Open SM') %>% 
    addProviderTiles(providers$Stamen.Toner, group = 'Toner') %>% 
    addProviderTiles(providers$CartoDB.Positron, group = 'CartoDB') %>% 
    addProviderTiles(providers$Esri.NatGeoWorldMap, group = 'NG World') %>% 
    setView(lng = -90, lat = 30, zoom = 10) %>% 

############################## 

    # this section is for plotting the variables 
    # each variable below is a layer in the map 

    # construction 
    addCircleMarkers(data = zipData, lat = ~Lat, lng = ~Lon, 
        color = ~colorsConst(ConstructionCode), popup = zipData$popUp, 
        radius = 5, group = 'Construction') %>% 
    # tiv 
    addCircleMarkers(data = zipData, lat = ~Lat, lng = ~Lon, 
        color = ~colorstivValue(tivLvl), popup = zipData$popUp, 
        radius = ~tiv/20000, group = 'Bldg Value') %>% 

    # year built 
    addCircleMarkers(data = zipData, lat = ~Lat, lng = ~Lon, 
        color = ~colorsYrBuilt(yrBuiltLvl), popup = zipData$popUp, 
        radius = ~YearBuilt/250, group = 'Yr Built') %>% 


###################################### 

    # layer control 

    addLayersControl(
     baseGroups = c('Open SM', 'Toner', 'Carto DB', 'NG World'), 

     overlayGroups = c('Construction', 
          'TIV', 
          'Yr Built' 
     ), 
     options = layersControlOptions(collapsed = F) 
    ) %>% 


#################################################  
add the legends for each of the variables 


    # construction   
    addLegend('bottomright', pal = colorsConst, values = zipData$ConstructionCode, 
       title = 'Construction Code', 
       opacity = 1) %>% 

    # tiv 
    addLegend('bottomleft', pal = colorstivValue, values = zipData$tivLvl, 
       title = 'TIV', 
       opacity = 1) %>% 

    # year built 
    addLegend('topleft', pal = colorsYrBuilt, values = zipData$yrBuiltLvl, 
       title = 'Yr Built', 
       opacity = 1) 


m # Print the map 

Ein Teil der Karte ist unten abgebildet.

This shows the layer control and the construction legend

+0

warum nicht 1,5 Jahre später behoben, keine Ahnung ... – Ufos

+0

Legende kann nur ~ verwenden, wenn der leaflet() -Aufruf die Daten hat; Wenn Sie die Datei leaflet() aufrufen, können alle Layer sie verwenden. Wie das geschrieben wird, erhält nur der addCircleMarkers-Aufruf die Daten, da er nur an diese Ebene übergeben wird. –

+0

Wie Joe darauf hingewiesen hat, würde Bryan's Beispiel sogar mit '~ login' funktionieren, wenn er nur' leaflet (zipData)%>% 'anstelle von' leaflet() ' – Ufos

2

Ich hatte die gleiche Botschaft

Error in UseMethod("doResolveFormula") : no applicable method for 'doResolveFormula' applied to an object of class "NULL" 

mit

data <- data.frame(lng1 = c(1, 2, 3), 
        lng2 = c(2, 3, 4), 
        lat1 = c(1, 2, 3), 
        lat2 = c(2, 3, 4), 
        values = c(1, 2, 3)) 

    pal_grid <- colorNumeric(palette = "YlGn", domain = data$values) 

    leaflet() %>% 
     addRectangles(lng1 = data$lng1, lat1 = data$lat1, 
       lng2 = data$lng2, lat2 = data$lat2, 
       fillColor = ~pal_grid(data$values), 
       fillOpacity = 0.2, 
       weight = 2, opacity = 0.5) 

Die Lösung zur Verfügung zu stellen, die Daten Broschüre, die Sie verwenden das Element in der Haupt Aufruf zu erstellen zu leaflet() oder im Aufruf zu irgendeinem Element, das Sie danach hinzufügen.

  1. Im Haupt Aufruf Prospekt():

    data <- data.frame(lng1 = c(1, 2, 3), 
           lng2 = c(2, 3, 4), 
           lat1 = c(1, 2, 3), 
           lat2 = c(2, 3, 4), 
           values = c(1, 2, 3)) 
    
    pal_grid <- colorNumeric(palette = "YlGn", domain = data$values) 
    
    leaflet(data = data) %>% 
        addRectangles(lng1 = data$lng1, lat1 = data$lat1, 
          lng2 = data$lng2, lat2 = data$lat2, 
          fillColor = ~pal_grid(data$values), 
          fillOpacity = 0.2, 
          weight = 2, opacity = 0.5) 
    
  2. Im Moment der Elemente hinzufügen:

    data <- data.frame(lng1 = c(1, 2, 3), 
           lng2 = c(2, 3, 4), 
           lat1 = c(1, 2, 3), 
           lat2 = c(2, 3, 4), 
           values = c(1, 2, 3)) 
    
    pal_grid <- colorNumeric(palette = "YlGn", domain = data$values) 
    
    leaflet() %>% 
        addRectangles(data = data, 
          lng1 = data$lng1, lat1 = data$lat1, 
          lng2 = data$lng2, lat2 = data$lat2, 
          fillColor = ~pal_grid(data$values), 
          fillOpacity = 0.2, 
          weight = 2, opacity = 0.5)` 
    
+0

verwenden würde. Tatsächlich kann ich sogar ein Beispiel mit' NA' erzeugen funktioniert einwandfrei, sobald 'leaflet()' mit dem Dataset in mode 'leaflet (my_data)' versehen ist. – Ufos