2015-06-04 25 views
7

Kiedy próbuję dodać legendę do ulotki, aby uzyskać mapę ulotek (przy użyciu pakietu Leaflet for R) zintegrowanego z aplikacją Shiny, legenda nie pokazuje kolorów palety kolorów. Zamiast tego pokazuje tylko kolory określone dla wartości NA, w tym przypadku białe.Legenda map ulotki w aplikacji R Shiny nie ma kolorów

legend without colors

Aplikacja wykonuje następujące operacje:

  • pierwsze, filtruje zbiór danych na podstawie danych użytkowników
  • Następnie generuje choropleth mapę z filtrowanych danych

To jest kod, którego użyłem do stworzenia legendy:

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

przypadku pal jest kwantylem paleta następująco

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

shp.data() oznacza reaktywną wyrażenie jest Shapefile przesączono na podstawie danych użytkownika i stat_selected jest specyficzny statystyczny, że użytkownik wybierze do odwzorowywania kolorów.

uzyskać następujące ostrzeżenia:

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' 

początkowo próbowali uczynić legendę wzorując się na ulotce na stronie R i używane argument values = ~stat.selected dla funkcji addLegend, ale mam ten błąd:

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

Na stronie pomocy: Jeśli NULL, a następnie za każdym razem, gdy wywoływana jest funkcja koloru, wartość x będzie reprezentować domenę. Oznacza to, że jeśli funkcja jest wywoływana wiele razy, kodowanie między wartościami i kolorami może nie być spójne; jeśli potrzebna jest spójność, musisz podać domenę, która nie jest NULL. Może zmiana wartości NULL pomoże? – ytk

Odpowiedz

2

Udało mi się pokazać kolory, zmieniając sposób, w jaki odwoływałem się do kolumny wartości w argumentach funkcji AddLegend. I umieścić zmienną stat.selected w podwójnych nawiasach, które zdawały się rozwiązać ten problem:

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

Dla wyjaśnienia, zmienna stat.selected pochodzi z poniższej instrukcji switch:

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

gdzie "tot_emp", "a_mean", "h_mean", i "loc_quotient" są nazwami kolumn w ramce danych przestrzennych wielokątów shp.data.

Domyślam się, że problem polegał na tym, że próbowałem przekazać nazwę kolumny przez zmienną za pomocą $.

Wciąż jestem dość początkującym użytkownikiem R, więc jeśli ktoś może wyjaśnić, dlaczego przykład z dokumentacji do ulotki dla R nie działa w tym przypadku, byłbym wdzięczny.

8

Wcześniej miałem tylko prosty fragment, który pokazał, jak dodawać legendy. Nie użyłem ~ przed wartościami legendy, jak to jest normą. Zrobiłem tradycyjną ramkę danych $ kolumna i działa ładnie.

To jest teraz aktualizowane, aby zobaczyć, jak to wszystko razem pasuje. Oto pełny przebieg mapowania po utworzeniu wszystkich zmiennych cięć itp.Końcowa oczyszczona ramka danych nosiła nazwę zipData

# 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 

Fragment mapy pokazano poniżej.

This shows the layer control and the construction legend

+0

dlaczego nie jest ustalona 1,5 roku później, nie ma pojęcia ... – Ufos

+0

Legenda może używać tylko ~, jeśli wywołanie ulotki() ma dane; jeśli podasz ulotkę(), wywołaj dane, wtedy wszystkie warstwy mogą z niej korzystać. Sposób w jaki jest to napisane, tylko wywołanie addCircleMarkers otrzymuje dane, ponieważ przekazywane są tylko do tej warstwy. –

+0

Jak zauważył Joe, przykład Bryana działałby nawet z '~ loginem ', gdyby używał tylko' ulotki (zipData)%>% 'zamiast' ulotki() ' – Ufos

2

miałem ten sam komunikat

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

z

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) 

Rozwiązaniem jest zapewnienie, aby ulotka danych, którego używasz do tworzenia elementu w głównym rozmowy do leaflet() lub w wywołaniu dowolnego elementu, który dodasz po tym.

  1. W głównym wezwanie do pacjenta():

    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. W momencie dodawania elementów:

    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

Rzeczywiście mogę nawet stworzyć przykład z' NA' który działa idealnie dobrze, po dostarczeniu 'ulotki()' z zestawem danych w modzie 'ulotka (my_data)'. – Ufos