R Shiny 应用程序中的传单地图图例不显示颜色
Leaflet map legend in R Shiny app has doesn't show colors
当我尝试将图例添加到传单地图(使用 Leaflet for R 包)并入 Shiny 应用程序时,图例不显示调色板的颜色。相反,它只显示为 NA 值指定的颜色,在本例中为白色。
该应用执行以下操作:
- 首先,它根据用户输入过滤一组数据
- 然后它根据过滤后的数据生成等值线图
这是我用来制作图例的代码:
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()
是一个反应式表达式,它是一个基于用户输入过滤的 shapefile,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"
我能够通过更改我在 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 用户,所以如果有人能解释为什么 Leaflet for R 文档中的示例在这种情况下不起作用,我将不胜感激。
之前我只有一个简单的代码片段,展示了如何添加图例。我没有像往常一样在图例值之前使用 ~ 。我做了传统的 dataframe$column,效果很好。
现在已更新,以了解它们如何组合在一起。这是在创建所有变量切割等之后的完整映射 运行。最终清理的数据帧称为 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
部分地图如下所示。
我收到了同样的消息
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()
的主调用或对之后添加的任何元素的调用中,向传单提供您用于创建元素的数据。
在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)
添加元素时:
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)`
当我尝试将图例添加到传单地图(使用 Leaflet for R 包)并入 Shiny 应用程序时,图例不显示调色板的颜色。相反,它只显示为 NA 值指定的颜色,在本例中为白色。
该应用执行以下操作:
- 首先,它根据用户输入过滤一组数据
- 然后它根据过滤后的数据生成等值线图
这是我用来制作图例的代码:
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()
是一个反应式表达式,它是一个基于用户输入过滤的 shapefile,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"
我能够通过更改我在 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 用户,所以如果有人能解释为什么 Leaflet for R 文档中的示例在这种情况下不起作用,我将不胜感激。
之前我只有一个简单的代码片段,展示了如何添加图例。我没有像往常一样在图例值之前使用 ~ 。我做了传统的 dataframe$column,效果很好。
现在已更新,以了解它们如何组合在一起。这是在创建所有变量切割等之后的完整映射 运行。最终清理的数据帧称为 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
部分地图如下所示。
我收到了同样的消息
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()
的主调用或对之后添加的任何元素的调用中,向传单提供您用于创建元素的数据。
在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)
添加元素时:
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)`