在shiny上构建React式Map小部件时,如何处理数据框中的因子值?

4xrmg8kj  于 2022-12-30  发布在  React
关注(0)|答案(2)|浏览(111)

我目前正在开发一个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变量的问题。实际上,与其他变量(如colorleaf)不同的是,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时,是否有可能考虑到其他数值类型和类别类型的值?
提前非常感谢您的帮助,新年快乐。

lstz6jyr

lstz6jyr1#

sprintf("%s: %g",map$state, map$variableplot)中,使用了因子变量map$variableplot的值(它们只是数字),但您需要levels。(因子变量只是数字,其中每个数字都被分配了一个水平。您可以使用str(map$variableplot)进行检查。)尝试使用以下方法提取因子存在时的水平:

variableplot_clean <- ifelse(is.factor(map$variableplot),
                             levels(map$variableplot), map$variableplot)

labels <- sprintf("%s: %s",map$state, variableplot_clean) %>%
  lapply(htmltools::HTML)
cbwuti44

cbwuti442#

由于color_leaf_grade是一个因子变量,您可以使用colorFactor函数生成调色板。您可以为因子集中的每个水平指定颜色,如下所示:

pal <- colorFactor(palette = c("red","yellow","orange","green"),
                levels = c("31-1","11-2","others","factor4..."))

然后,addPolygons将如下所示:

addPolygons(
    fillColor = ~pal(color_leaf_grade),
    color = "white",
    dashArray = "3",
    fillOpacity = 0.7,
    label = labels
  )

相关问题