2015-06-04 161 views
7

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

legend without colors

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

  • 首先,它基于用户输入
  • 然后,它产生从所述滤波的数据的等值线图过滤器的一组数据的

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

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()是反应性表达式,它是过滤shape文件基于用户输入和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.selectedaddLegend功能,但我得到这个错误:

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

从帮助页面: 如果为NULL,则每当调用生成的颜色函数时,x值将代表域。这意味着如果函数被多次调用,值和颜色之间的编码可能不一致;如果需要一致性,则必须提供非空域。 也许改变NULL会有帮助吗? – ytk

回答

2

我能够通过改变我在AddLegend函数的参数中引用值列的方式来显示颜色。我把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用户,所以如果任何人都可以解释为什么R的文档中的例子在这种情况下不起作用,我将不胜感激。

8

此前我只是一个简单的片段,展示了如何添加传说。我没有像图例那样在图例值之前使用〜。我做了传统的数据框$列,它很好地工作。

这是现在更新,看看它是如何融合在一起。这是一个完整的映射运行后,创建所有的变量削减,等等。最后清理的数据帧被称为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

图例只能使用〜如果leaflet()调用有数据;如果您给小册子()调用数据,那么所有图层都可以使用它。这样写的方式,只有addCircleMarkers调用实际上被赋予了数据,因为它只被传递给该层。 –

+0

正如乔指出的那样,即使使用'〜login',Bryan的例子也可以解决,只要他使用'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'一旦'leaflet()'以时尚'leaflet(my_data)'提供的数据集的形式提供,就可以完美地工作。 – Ufos