当在 Shiny 中选择不同的变量时,如何制作一个反应调色板,它会改变地图上多边形的颜色?
How do I make a reactive palette, which changes the colour of polygons on a map, when a different variable is selected in Shiny?
这是我的第一个问题,如果它没有达到标准,我深表歉意,但我遇到了一个问题,我真的需要帮助。
我正在尝试创建一个闪亮的应用程序,它将允许您从下拉菜单中 select 一个物种,从而更改地图上国家/地区多边形的颜色,一种颜色表示存在,另一种颜色缺席。我用 shapefile 数据创建了一个 sf 对象,并将它与存在缺失(分别为 1 +0)数据框合并,目的是 select 这个物种的离子将改变 input$SppSelect,select在合并的 sf 对象中添加不同的列,然后这将导致我的传单地图重新绘制并出现新物种。
为了给地图上色,我打算将我的物种输入变量分配给另一个变量:sppcol <- reactive({input$SppSel})
,然后使用 Botpal <- reactive({colorFactor(viridis(2), BotCon$sppcol())})
制作反应调色板。然后我会使用 fillColor = ~Botpal(Botcon$sspcol())
来改变多边形的颜色。
我不确定我是否可以生成一个 reprex,但我会尝试说明该应用程序应该如何工作。 Palms = csv 文件,每个物种出现在国家旁边:
( 中国 : caryota mitis)
(中国 : caryota 编号)
(不丹: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)
因此我的问题是;我如何使用我的物种 selection 输入到 select 我创建的合并数据集的不同列,并使用此列中的 1 和 0 为我的地图多边形着色?
(对于布局真的很抱歉,我对所有这些东西也是自学的)
当然可以。我们可以在创建调色板时执行此操作,即这部分代码:
Botpal <- reactive({colorFactor(viridis(2), jointdataset$sppcol())})
我没有你的数据或地图文件,所以下面是一个通用的最小示例:
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)
这是我的第一个问题,如果它没有达到标准,我深表歉意,但我遇到了一个问题,我真的需要帮助。
我正在尝试创建一个闪亮的应用程序,它将允许您从下拉菜单中 select 一个物种,从而更改地图上国家/地区多边形的颜色,一种颜色表示存在,另一种颜色缺席。我用 shapefile 数据创建了一个 sf 对象,并将它与存在缺失(分别为 1 +0)数据框合并,目的是 select 这个物种的离子将改变 input$SppSelect,select在合并的 sf 对象中添加不同的列,然后这将导致我的传单地图重新绘制并出现新物种。
为了给地图上色,我打算将我的物种输入变量分配给另一个变量:sppcol <- reactive({input$SppSel})
,然后使用 Botpal <- reactive({colorFactor(viridis(2), BotCon$sppcol())})
制作反应调色板。然后我会使用 fillColor = ~Botpal(Botcon$sspcol())
来改变多边形的颜色。
我不确定我是否可以生成一个 reprex,但我会尝试说明该应用程序应该如何工作。 Palms = csv 文件,每个物种出现在国家旁边:
( 中国 : caryota mitis)
(中国 : caryota 编号)
(不丹: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)
因此我的问题是;我如何使用我的物种 selection 输入到 select 我创建的合并数据集的不同列,并使用此列中的 1 和 0 为我的地图多边形着色?
(对于布局真的很抱歉,我对所有这些东西也是自学的)
当然可以。我们可以在创建调色板时执行此操作,即这部分代码:Botpal <- reactive({colorFactor(viridis(2), jointdataset$sppcol())})
我没有你的数据或地图文件,所以下面是一个通用的最小示例:
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)