Как сделать реактивную палитру, которая изменяет цвет полигонов на карте, когда в Shiny выбрана другая переменная? - PullRequest
0 голосов
/ 05 мая 2020

Это мой первый вопрос, поэтому прошу прощения, если все не так, но я застрял в проблеме, и мне действительно нужна помощь, пожалуйста.

Я пытаюсь создать блестящее приложение, которое позволит вам выбрать вид из выпадающего меню, тем самым изменив цвет полигонов страны на карте, 1 цвет для присутствия и другой для отсутствия. Я создал объект sf с данными шейп-файла и объединил его с фреймом данных отсутствия присутствия (1 + 0 соответственно), намерение состоит в том, что выбор этого вида изменит input $ SppSelect, выбрав другой столбец в объединенном объекте sf, а затем это приведет к тому, что моя карта листовок будет перерисована с появлением нового вида.

Чтобы раскрасить карту, я намеревался назначить входную переменную моего вида другой переменной: sppcol <- reactive({input$SppSel}), а затем использовать Botpal <- reactive({colorFactor(viridis(2), BotCon$sppcol())}), чтобы создать реактивную палитру. Затем я бы использовал fillColor = ~Botpal(Botcon$sspcol()), чтобы изменить цвет многоугольников.

Я не уверен, смогу ли я создать репрезент, но я попытаюсь проиллюстрировать, как приложение должно работать. Palms = csv файл со всеми видами, встречающимися рядом со страной, в:

(китай: caryota mitis)

(китай: caryota no)

(Бутан: caryota mitis ).

BotCon - это шейп-файл ботанических стран, с которым я работаю. :

ui <- fluidPage(

  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "SppSel", 
                  label = "Species Selection",
                  choices = paste(Palms$SpecName)),
    ),
    mainPanel(
      leafletOutput("mymap", height=600)
    )))


server <- function(input, output) {

  PresAb <- create.matrix(Palms, tax.name = "SpecName", locality = "Area_code_L3")

  PresAb.df <- as.data.frame(t(PresAb))

  PresAb.dfnamed <- cbind(LEVEL3_COD = rownames(PresAb.df), PresAb.df)

  jointdataset <- merge(BotCon, PresAb.dfnamed, by = 'LEVEL3_COD', all.y=TRUE)

  sppcol <- reactive({input$SppSel})

  Botpal <- reactive({colorFactor(viridis(2), jointdataset$sppcol())})


  output$mymap <- renderLeaflet({
    leaflet() %>%
      addTiles() %>%
      addPolygons(data=jointdataset, 
                  stroke = TRUE,smoothFactor = 0.3, weight = 1, fillOpacity = 0.5,  
                  fillColor = ~Botpal(jointdataset$"caryota mitis")
  }) }

shinyApp(ui = ui, server = server)

Поэтому мой вопрос; Как я могу использовать входные данные для выбора вида, чтобы выбрать другой столбец объединенного набора данных, который я создал, и раскрасить полигоны моей карты, используя единицы и нули, присутствующие в этом столбце, пожалуйста?

(очень извините за макет, я тоже в значительной степени самоучка для всего этого)

1 Ответ

1 голос
/ 06 мая 2020

Конечно. Мы можем сделать это, когда создана цветовая палитра, то есть эта часть кода:
Botpal <- reactive({colorFactor(viridis(2), jointdataset$sppcol())})

У меня нет ваших данных или файла карты, поэтому ниже приведен общий c минимальный например:


library(leaflet)
library(maps)
library(shiny)


ui <- fluidPage(

    leafletOutput("map_1"),

    selectInput(inputId = "input_species", label = "Species Selection", choices = c("Species 1", "Species 2", "Species 3"))

)


server <- function(input, output, session) {

    #Load a map of the US from the 'map' package (runs once when apps starts)
    shp_map = map("state", fill = TRUE, plot = FALSE)

    #Make up a dataframe with some data for three species for each state (runs once when apps starts)
    df_data <- expand.grid(state = unique(shp_map$names), species = c("Species 1", "Species 2", "Species 3"))
    df_data$value <- sample(1:1000, nrow(df_data))

    #Create map
    output$map_1 <- renderLeaflet({

        #Filter dataframe based on what species is selected
        df_map <- df_data[df_data$species == input$input_species ,]

        #Set color based on what species is selected
        if(input$input_species == "Species 1") {color_selected = "Blues"}
        if(input$input_species == "Species 2") {color_selected = "Reds"}
        if(input$input_species == "Species 3") {color_selected = "Greens"}

        #Create a palette function, using the selected color
        palette <- colorNumeric(palette = color_selected, domain = df_map$value)

        #Use the palette function created above to add the appropriate RGB value to our dataframe
        df_map$color <- palette(df_map$value)

        #Create map
        map_1 <- leaflet(data = shp_map) %>% 

            addPolygons(fillColor = df_map$color, fillOpacity = 1, weight = 1, color = "#000000", popup = paste(sep = "", "<b>", paste(shp_map$names), " ", "</b><br>", df_map$value)) 

        map_1

    })

}

shinyApp(ui, server)
...