2015-06-04 2 views
7

Когда я пытаюсь добавить легенду к карте листовка для карты листовка (с использованием пакета), встроенного в приложение Shiny, легенда не отображает цвета цветовой палитры. Вместо этого он отображает только цвета, указанные для значений NA, в данном случае белые.Легенда легенд карты в R Shiny app не показывает цвета

legend without colors

Приложение выполняет следующие действия:

  • Во-первых, он фильтрует набор данных на основе данных, вводимых пользователем
  • Затем он генерирует choropleth карту из отфильтрованных данных

Это код, который я использовал для создания легенды:

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

Где pal является квантилем цветовой палитры следующим

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

shp.data() представляет собой реакционноспособное выражение, которое является шейпфайлом фильтруется на основе данных, вводимый пользователя, и stat_selected удельная статистика, что пользователь выбирает для отображения на цветы.

я получаю следующие предупреждения:

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' 

Первоначально я пытался сделать легенду, следуя примеру на листке для R-страницы и используемые аргументы values = ~stat.selected для функции addLegend, но я получил эту ошибку:

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

На странице справки: Если NULL, то всякий раз, когда вызывается полученная цветовая функция, значение x будет представлять собой домен. Это означает, что если функция вызывается несколько раз, кодирование между значениями и цветами может быть непротиворечивым; если требуется согласованность, вы должны предоставить домен, отличный от NULL. Возможно, изменение NULL поможет? – ytk

ответ

2

Мне удалось отобразить цвета, изменив способ, которым я ссылался на столбец значений в аргументах функции AddLegend. Я ставлю переменную stat.selected в двойные квадратные скобки, которые, казалось, чтобы решить эту проблему:

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

Для уточнения, переменная stat.selected исходит из следующего оператора коммутатора:

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

где "tot_emp", "a_mean", "h_mean", и "loc_quotient" - это имена столбцов в фрейме данных пространственных полигонов shp.data.

Я думаю, проблема заключалась в том, что я пытался передать имя столбца переменной с помощью $.

Я по-прежнему довольно послушный пользователь R, поэтому, если кто-нибудь может объяснить, почему пример в документации для лифтов для R не работает, в этом случае я был бы признателен.

8

Раньше у меня был простой фрагмент, который показывал, как добавлять легенды. Я не использовал значение ~ до значений легенды, как норма. Я сделал традиционный столбец dataframe $, и он отлично работает.

Это обновление обновлено, чтобы увидеть, как все это сочетается. Вот полноценный запуск сопоставления после создания всех переменных разрезов и т. Д.Окончательный очищенный фрейм данных был назван 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 

Часть карты показана ниже.

This shows the layer control and the construction legend

+0

Почему не исправлено 1,5 года спустя, нет подсказки ... – Ufos

+0

Легенда может использовать ~, если вызов листовки() имеет данные; если вы дадите буклет() вызов данных, тогда все слои смогут его использовать. Как это написано, только вызов addCircleMarkers фактически получает данные, поскольку он передается только этому слою. –

+0

Как отметил Джо, пример Брайана будет работать даже с '' login', если бы он использовал 'leaflet (zipData)%>%' вместо 'leaflet()' – Ufos

2

У меня было то же самое сообщение

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

с

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) 

Решение предоставить листовка данные, которые вы используете для создания элемента в главном вызове до leaflet() или в вызове любого элемента, который вы добавите после этого.

  1. В главном вызове листовка():

    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. В момент добавления элементов:

    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

Действительно, я даже могу привести пример с 'NA', который отлично работает, как только 'paperlet()' предоставляется с набором данных в моду 'листочка (my_data)'. – Ufos

Смежные вопросы