首页 > 解决方案 > 如何使用空间多边形数据框制作反应性闪亮地图

问题描述

我想使用空间多边形数据框用 r 创建一个反应性闪亮的世界地图。这个想法是有一个不同年份的滑块,可以移动并用作为国家着色的输入。我的问题是使数据具有反应性,当我运行附加在滑块下方的代码时,输​​入值被采用(例如,对于所有国家,值为 2004)和错误消息“pal(input$year)中的警告:一些值超出色阶,将被视为 NA”弹出。使应用程序“静态”(写入 sp_Suicide$2004而不是 input$year)时,地图会正确显示。如何以访问每个国家/地区的数据的方式链接滑块的输入,而不是简单地将年份作为输入?非常感谢您的任何回复!

library(shiny)
library(leaflet)
library(data.table)
library(sp)

#read data in (data table)
Suicide<-fread("Final_Suicide_Data.csv", header=T)

#read shapefile in
world<-readOGR(dsn=".", layer="TM_WORLD_BORDERS-0.3")

#Merge Suicide data to shapefile
sp_Suicide<-sp::merge(world, Suicide, all.x=T, by.x='UN', by.y='un') #SpatialPolygonDataFrame

#make shiny application
ui <- fluidPage(

   # Application title
   titlePanel("Suicide"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
     leafletOutput("suicidemap"),
      sidebarPanel(
         sliderInput("year",
                     "Year:",
                     min = 2004,
                     max = 2015,
                     value = 11,
                     sep="")

      )
   )
)



server <- function(input, output, session) {
  output$suicidemap<-renderLeaflet({
    leaflet(data=sp_Suicide)%>%
      addProviderTiles("CartoDB.Positron")%>%
      addPolygons(fillColor=~pal(input$year),
                  fillOpacity = 0.7,
                  color="#BDBDC3",
                  weight=1) %>%
      addLegend("bottomleft",
                pal=pal,
                values=~input$year,
                title="")   

  })
}

# Run the application 
shinyApp(ui = ui, server = server)

更新:非常感谢您的广泛回答:) 在下面,我重新创建了我正在使用的数据外观的示例。

UN<-c(4,8,12)
Country<-c('Afghanistan', 'Albania', 'Algeria')
`2004`<-c(6.68, 7.69, 4.84)
`2005`<-c(6.68, 7.7, 4.84)
`2006`<-c(6.74, 7.15, 4.56)
`2007`<-c(6.81, 6.61, 4.27)
`2008`<-c(6.87, 6.07, 3.97)
`2009`<-c(6.93, 5.54, 3.69)
`2010`<-c(7, 5, 3.4)
`2011`<-c(7.02, 4.76, 3.34)
`2012`<-c(7.04, 4.52, 3.28)
`2013`<-c(7.06, 4.28, 3.22)
`2014`<-c(7.08, 4.04, 3.16)
`2015`<-c(7.1, 3.8, 3.1)
SuicideData<-data.frame(UN, Country, `2004`, `2005`, `2006`, `2007`, `2008`,    `2009`, `2010`, `2011`, `2012`, `2013`, `2014`, `2015`)
names(SuicideData)<-c("UN", "Country", "2004", "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015")

此外,这是我(尝试)使用的 shapefile:Link to shapefile

我尝试运行您的代码,但它仍然无法正常工作。我用作输入的数据是否可能必须采用不同的格式?我正在尝试继续使用仅将输入数据与 shapefile 合并的有趣方法!

标签: rshinyreactive

解决方案


如果没有可重复的例子,很难提供正确的答案。但是,如果我正确理解你想要做什么,你似乎错过了几个步骤。我在下面发布了一些示例代码,希望它可以作为模板和指南有所帮助。

假设我们有一个按suidata年份yearworldshap解决此问题的一种方法是:

ui <- fluidPage(

  # Application title
  titlePanel("Suicide"),

  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    leafletOutput("suicidemap"),
    sidebarPanel(
      sliderInput("year",
                  "Year:",
                  min = 2004,
                  max = 2015,
                  value = 2011, #value is the starting value so should be value within date range
                  sep="",
                  ticks = FALSE)))) # False for aesthetics because otherwise displays irregular tick intervals

我们首先需要在反应函数中选择我们想要的数据(基于滑块输入)(注意我们在这个阶段没有合并任何东西,不像你上面的例子):

server <- function(input, output, session) {
selected <- reactive({
suidata <- filter(suidata,
year == input$year)
suidata
})

在这里,我们只是将一个数据子集传递给一个函数selected,该数据子集取决于滑块输入的设置。例如,如果 2011 年,发送来渲染下面的传单地图的数据将只是 2011 年数据的子集。不过,在此之前,我们要设置底图。这包含我们想要的 Leaflet 地图的所有元素——例如,来自 CartoDB 的图块、指定的长、纬度和缩放(即您必须替换这些值)以及图例。我的假设是抛出的错误是因为您没有正确定义调色板。我的建议是在全局部分设置调色板(即,在闪亮的应用程序之外并在整个数据范围内执行此操作)。我在最后举了一个例子来说明如何做到这一点。

output$suicidemap <- renderLeaflet({
  leaflet() %>% 
    addTiles("CartoDB.Positron") %>% 
    setView(long, lat, zoom= x)%>%
    addLegend("bottomright", pal=pal, values=suidata$sum_suicides, title = "Title of legend")
})

然后在反应式观察者中,我们将 shapefile 与所选数据合并(注意选择后的重要括号(因为从技术上讲,这是我们正在调用的函数)。然后这将调用指定年份的数据并绘制它。

observe({
  if(!is.null(input$year)){
      shapefile@data <- left_join(shapefile@data, selected(), by="ID")
      leafletProxy("suicidemap", data = shapefile) %>%
        addTiles() %>% 
        clearShapes() %>% 
        addPolygons(data = shapefile, fillColor = ~pal(sum_suicides), fillOpacity = 0.7, 
                    color = "white", weight = 2)
    }})

}

# Run the application 
shinyApp(ui, server)

定义调色板——假设我们希望地图上的图例保持不变,显示最高和最低理论值,那么我们需要在此范围内定义调色板。如果我们查看年度总量,最高值将是年度自杀人数最多的国家和最低年度自杀人数的国家。因此,我们将全局调色板定义为:

pal <- colorBin("YlOrRd", suidata$sum_suicides, bins=5, na.color = "#bdbdbd")

我希望这有点用:)


推荐阅读