R Shiny应用程序中的宣传单地图图例并未显示颜色

时间:2015-06-04 21:22:27

标签: r shiny leaflet

当我尝试将图例添加到传单应用程序中的传单地图(使用Leaflet for R包)的传单地图时,图例不会显示调色板的颜色。相反,它只显示为NA值指定的颜色,在本例中为白色。

legend without colors

该应用程序执行以下操作:

  • 首先,它根据用户输入过滤一组数据
  • 然后它从过滤后的数据中生成一个等值区域图

这是我用来制作图例的代码:

brown.yourfiletype

其中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") 是一个反应式表达式,它是根据用户输入过滤的shapefile,shp.data()是用户选择映射到颜色的特定统计信息。

我收到以下警告:

stat_selected

我最初尝试按照R页面的传单上的示例制作图例,并使用参数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' 作为values = ~stat.selected函数,但我收到此错误:

addLegend

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

我能够通过改变AddLegend函数参数中引用values列的方式来显示颜色。我将stat.selected变量放在双括号中,这似乎可以解决问题:

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

为了澄清,stat.selected变量来自以下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"
)

其中"tot_emp""a_mean""h_mean""loc_quotient"shp.data空间多边形数据框中的列名。

我想问题是我试图使用$按变量传递列名。

我仍然是一个相当新手的R用户,所以如果有人能解释为什么Leaflet for R文档中的例子在这种情况下不起作用我会很感激。

答案 2 :(得分: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. 在对leaflet()的主要调用中:

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