r - 如何使用空间多边形数据框制作反应性闪亮地图
问题描述
我想使用空间多边形数据框用 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 合并的有趣方法!
解决方案
如果没有可重复的例子,很难提供正确的答案。但是,如果我正确理解你想要做什么,你似乎错过了几个步骤。我在下面发布了一些示例代码,希望它可以作为模板和指南有所帮助。
假设我们有一个按suidata
年份year
(worldshap
解决此问题的一种方法是:
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")
我希望这有点用:)
推荐阅读
- excel - 执行时忽略“FillDown”代码
- css - 无法将 SCSS 值分配给 css 自定义属性(css 变量)
- java - 如何使用java根据Key值更新XML文件值
- c++ - 现代 CMake (3.8+) - FindCUDA 已弃用,非 .cu 文件呢?
- scripting - 想在 CATIA 中使用 python?这种方法 CATIA = win32com.client.Dispatch("CATIA.Application") 给我一个错误?
- javascript - 为ajax上传添加进度条
- apache - Apache mod 编译错误:apxs mod_antiloris.c
- c# - 如何将 {,},[,] 括号添加到正则表达式模式以允许它们作为特殊字符
- python - 将 python 连接到 Hive
- mysql - SQL编写自定义查询