我目前正在开发一个React式Map。这个Map基本上是一个美国Map,选择器使用户能够显示不同的质量变量。使用的数据框(称为data
)如下所示(这里的数据是随机的):
head(data)
state year color leaf mike_value strength length color_leaf_grade staple
1 Alabama 2020 41 1 40.24 300.12 37.00 31-4 34
2 Arkansas 2020 31 1 45.57 300.12 37.80 31-4 34
3 Arizona 2020 11 2 45.51 300.12 37.11 11-2 34
4 California 2020 11 2 45.94 300.12 39.40 others 34
5 Florida 2020 21 3 45.83 300.12 37.18 31-1 37
6 Georgia 2020 41 3 45.06 300.12 36.58 others 37
我遇到了color_leaf_grade
变量的问题。实际上,与其他变量(如color
或leaf
)不同的是,color_leaf_grade
是一个因子。我希望根据不同的因子水平对Map进行着色(总共4个不同的级别)。然而,当我这样做的时候,我会得到一些奇怪的东西。就像下面的截图所看到的那样,它根据状态所属的级别对不同的状态着色(这正是我想要的),但不是在图例和使用鼠标悬停在Map上时出现的弹出窗口中显示级别名称,而是显示值1、2、3、4.我已经尝试为因子水平指定新名称,但没有效果。
以下是我的Map小部件的Shiny应用程序的ui
部分:
tabItem(tabName = "dashboard_map",
fluidRow(
box(selectInput("variable_selected",
label = "Select variable",
choices = c(
"Color" = "color",
"Leaf" = "leaf",
"Mike" = "mike_value",
"Strength" = "strength",
"Length" = "length",
"Color leaf grade" = "color_leaf_grade",
"Staple" ="staple"
)),
width = 9)
),
fluidRow(
box(leafletOutput(outputId = "map"), width = 9),
box(selectInput("myear_selected",
label = "Marketing year:",
choices=c(year_range),
selected = year_range[length(year_range)]),
width = 3)),
以下是我的Map小部件的Shiny应用程序的server
部分:
# MAP
output$map <- renderLeaflet({
# Add data to map
datafiltered <- data[which(data$year == input$myear_selected),]
orderstates <- match(map@data$STATE_NAME, datafiltered$state)
map@data <- datafiltered[orderstates,]
# Create variableplot
# ADD this to create variableplot
map$variableplot <- as.numeric(map@data[, input$variable_selected])
# Create leaflet
pal <- colorBin("YlOrRd",
domain = map$variableplot,
bins = 5)
labels <- sprintf("%s: %g",map$state, map$variableplot) %>%
lapply(htmltools::HTML)
l <-
leaflet(map, options = leafletOptions(zoomSnap = 0.25, zoomDelta = 0.25,zoomControl = FALSE)) %>%
addTiles() %>%
setView(lng = -98,
lat = 36,
zoom = 3.75) %>%
addPolygons(
fillColor = ~ pal(variableplot),
color = "white",
dashArray = "3",
fillOpacity = 0.7,
label = labels
) %>%
leaflet::addLegend(
"bottomright",
pal = pal,
values = ~ variableplot,
opacity = 0.7,
title = NULL
)
})
在座的各位有没有人知道,在构建这样一个React式Map时,是否有可能考虑到其他数值类型和类别类型的值?
提前非常感谢您的帮助,新年快乐。
2条答案
按热度按时间lstz6jyr1#
在
sprintf("%s: %g",map$state, map$variableplot)
中,使用了因子变量map$variableplot
的值(它们只是数字),但您需要levels
。(因子变量只是数字,其中每个数字都被分配了一个水平。您可以使用str(map$variableplot)
进行检查。)尝试使用以下方法提取因子存在时的水平:cbwuti442#
由于
color_leaf_grade
是一个因子变量,您可以使用colorFactor函数生成调色板。您可以为因子集中的每个水平指定颜色,如下所示:然后,addPolygons将如下所示: