带有 rCharts 的 Shiny 中的热图
Heat map in Shiny with rCharts
我正在尝试做类似于 Ramnath 的休斯顿犯罪数据热图演示的事情,但我 运行 遇到了一些问题。也就是说,除了它的整个热图部分之外,一切似乎都在工作。
我有西雅图犯罪信息的数据集;数据片段如下:
Offense Date Longitude Latitude
3 Assault 2015-10-02 -122.3809 47.66796
5 Assault 2015-10-03 -122.3269 47.63436
6 Assault 2015-10-04 -122.3342 47.57665
7 Weapon 2015-04-12 -122.2984 47.71930
8 Assault 2015-06-30 -122.3044 47.60616
9 Burglary 2015-09-04 -122.2754 47.55392
我正在尝试创建一个 Shiny 应用程序,该应用程序将根据用户选择的日期范围和部分违规行为显示热图。
这是我的 ui.R:
library(shiny)
library(rCharts)
library(rjson)
shinyUI(fluidPage(
headerPanel("Crime in Seattle"),
sidebarPanel(
uiOutput("select.date.ran"),
uiOutput("select.crime")
),
mainPanel(chartOutput("my.map", "leaflet"),
tags$style('.leaflet {height: 500px;}'),
tags$head(tags$script(src="http://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js")),
uiOutput('spd.map'))
))
和server.R:
library(shiny)
library(rCharts)
library(rjson)
spd <- readRDS("data/spd.rds")
shinyServer(function(input, output, session) {
output$select.date.ran <- renderUI({
dateRangeInput("sel.date", "Choose date range:",
start = "2014/01/01", end = "2015/10/05",
separator = "to", format = "yyyy/mm/dd",
startview = "month", weekstart = 0,
language = "en")
})
output$select.crime <- renderUI({
checkboxGroupInput(inputId = "sel.crime", "Select crimes:",
choices = c("Theft", "Fraud", "Drugs/Alcohol",
"Weapon", "Assault", "Disturbance",
"Robbery", "Homicide", "Prostitution"),
selected = "Theft")
})
output$my.map <- renderMap({
my.map <- Leaflet$new()
my.map$setView(c(47.5982623,-122.3415519) ,12)
my.map$tileLayer(provider="Esri.WorldStreetMap")
my.map
})
output$spd.map <- renderUI({
spd.dat <- spd[spd$Offense %in% input$sel.crime &
(spd$Date >= input$sel.date[1] &
spd$Date <= input$sel.date[2]), c(3, 4)]
spd.json <- toJSONArray2(spd.dat, json = FALSE, names = FALSE)
tags$body(tags$script(HTML(sprintf("
<script>
var addressPoints = %s
var heat = L.heatLayer(addressPoints, {maxZoom: 9, radius: 20, blur: 40}).addTo(map)
</script>", rjson::toJSON(spd.json)
))))
})
})
这与我在 Internet 上找到的示例没有太大不同,但实际情况是显示了地图,并且所有侧边栏元素都在那里,但没有出现热图。我试过在 L.heatLayer 调用中使用 radius 和 blur,但没有效果。
我在测试中注意到的一件事是 toJSONArray2 需要很长时间才能执行,以至于它可能非常昂贵。为了解决这个问题,我尝试逐渐将数据集从 650,000 个观察值减少到大约 15,000 个。这不会改变任何东西。我不确定这是否真的是问题所在。
谁能帮我指出我的问题所在的方向?提前致谢!
事实证明,有两个问题,前两个问题解决后又出现了第三个问题。
首先,HTML(sprintf(... 中的 <script>
是不必要的。我认为这是导致 "Uncaught SyntaxError: Unexpected token <" 错误的原因。
一旦我明白了这一点,似乎 json 并没有被 L.heatLayer 视为 lat/lon 对。我不确定为什么会这样,但正在改变
spd.dat <- spd[spd$Offense %in% input$sel.crime &
(spd$Date >= input$sel.date[1] &
spd$Date <= input$sel.date[2]), c(3, 4)]
spd.json <- toJSONArray2(spd.dat, json = FALSE, names = FALSE)
到
spd.dat <- spd[spd$Offense %in% input$sel.crime &
(spd$Date >= input$sel.date[1] &
spd$Date <= input$sel.date[2]), ]
spd.arr <- toJSONArray2(spd.dat[c(3,4)], json = FALSE, names = FALSE)
即选择 toJSONArray2 内的纬度和经度列,解决了这个问题。
最后,一旦热图出现,我意识到地图状态的每一次变化都会在现有热图之上重新绘制热图,以至于应用程序会在一段时间后冻结。 This 答案提供了此问题的解决方案。
我正在尝试做类似于 Ramnath 的休斯顿犯罪数据热图演示的事情,但我 运行 遇到了一些问题。也就是说,除了它的整个热图部分之外,一切似乎都在工作。
我有西雅图犯罪信息的数据集;数据片段如下:
Offense Date Longitude Latitude
3 Assault 2015-10-02 -122.3809 47.66796
5 Assault 2015-10-03 -122.3269 47.63436
6 Assault 2015-10-04 -122.3342 47.57665
7 Weapon 2015-04-12 -122.2984 47.71930
8 Assault 2015-06-30 -122.3044 47.60616
9 Burglary 2015-09-04 -122.2754 47.55392
我正在尝试创建一个 Shiny 应用程序,该应用程序将根据用户选择的日期范围和部分违规行为显示热图。
这是我的 ui.R:
library(shiny)
library(rCharts)
library(rjson)
shinyUI(fluidPage(
headerPanel("Crime in Seattle"),
sidebarPanel(
uiOutput("select.date.ran"),
uiOutput("select.crime")
),
mainPanel(chartOutput("my.map", "leaflet"),
tags$style('.leaflet {height: 500px;}'),
tags$head(tags$script(src="http://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js")),
uiOutput('spd.map'))
))
和server.R:
library(shiny)
library(rCharts)
library(rjson)
spd <- readRDS("data/spd.rds")
shinyServer(function(input, output, session) {
output$select.date.ran <- renderUI({
dateRangeInput("sel.date", "Choose date range:",
start = "2014/01/01", end = "2015/10/05",
separator = "to", format = "yyyy/mm/dd",
startview = "month", weekstart = 0,
language = "en")
})
output$select.crime <- renderUI({
checkboxGroupInput(inputId = "sel.crime", "Select crimes:",
choices = c("Theft", "Fraud", "Drugs/Alcohol",
"Weapon", "Assault", "Disturbance",
"Robbery", "Homicide", "Prostitution"),
selected = "Theft")
})
output$my.map <- renderMap({
my.map <- Leaflet$new()
my.map$setView(c(47.5982623,-122.3415519) ,12)
my.map$tileLayer(provider="Esri.WorldStreetMap")
my.map
})
output$spd.map <- renderUI({
spd.dat <- spd[spd$Offense %in% input$sel.crime &
(spd$Date >= input$sel.date[1] &
spd$Date <= input$sel.date[2]), c(3, 4)]
spd.json <- toJSONArray2(spd.dat, json = FALSE, names = FALSE)
tags$body(tags$script(HTML(sprintf("
<script>
var addressPoints = %s
var heat = L.heatLayer(addressPoints, {maxZoom: 9, radius: 20, blur: 40}).addTo(map)
</script>", rjson::toJSON(spd.json)
))))
})
})
这与我在 Internet 上找到的示例没有太大不同,但实际情况是显示了地图,并且所有侧边栏元素都在那里,但没有出现热图。我试过在 L.heatLayer 调用中使用 radius 和 blur,但没有效果。
我在测试中注意到的一件事是 toJSONArray2 需要很长时间才能执行,以至于它可能非常昂贵。为了解决这个问题,我尝试逐渐将数据集从 650,000 个观察值减少到大约 15,000 个。这不会改变任何东西。我不确定这是否真的是问题所在。
谁能帮我指出我的问题所在的方向?提前致谢!
事实证明,有两个问题,前两个问题解决后又出现了第三个问题。
首先,HTML(sprintf(... 中的 <script>
是不必要的。我认为这是导致 "Uncaught SyntaxError: Unexpected token <" 错误的原因。
一旦我明白了这一点,似乎 json 并没有被 L.heatLayer 视为 lat/lon 对。我不确定为什么会这样,但正在改变
spd.dat <- spd[spd$Offense %in% input$sel.crime &
(spd$Date >= input$sel.date[1] &
spd$Date <= input$sel.date[2]), c(3, 4)]
spd.json <- toJSONArray2(spd.dat, json = FALSE, names = FALSE)
到
spd.dat <- spd[spd$Offense %in% input$sel.crime &
(spd$Date >= input$sel.date[1] &
spd$Date <= input$sel.date[2]), ]
spd.arr <- toJSONArray2(spd.dat[c(3,4)], json = FALSE, names = FALSE)
即选择 toJSONArray2 内的纬度和经度列,解决了这个问题。
最后,一旦热图出现,我意识到地图状态的每一次变化都会在现有热图之上重新绘制热图,以至于应用程序会在一段时间后冻结。 This 答案提供了此问题的解决方案。