美国县地图的情节可视化太慢了

时间:2018-02-22 06:56:37

标签: r plotly

我的数据集大约有90K行,后面有列

state_name, county_name, county_lat, count_long, value_x

仅适用于加利福尼亚县here

的类似直接示例

虽然它适用于一个状态,但是当我为美国的所有州做的时候,当我尝试放大和缩小时,情节很慢,并且悬停数据也需要时间来加载。情节生成本身需要一些时间

有没有解决方案来克服这种滞后?如果没有,是否有像plotly这样的交互式图表具有悬停和缩放功能,并且在视觉上色彩丰富,可以绘制地图?

1 个答案:

答案 0 :(得分:2)

此处的部分问题似乎是plotly R API似乎不支持在多边形要素上使用不同颜色的填充和边框。

您可以做出的一个权衡是接受这样一个事实,即不能单独修改线条颜色以避免每个多边形绘制两次。由于没有绘制仅限于线条的轨迹,悬停信息的工作非常顺利,对于这组具有~88,000个顶点的多边形,对缩放的重新渲染速度略有提高。

生成的.html输出文件(Web浏览器交互需要多少处理的合适代理)没有额外行跟踪的方法在磁盘上为7.7 MB,而在12.1MB时则为12.1MB您可以使用示例中的方法。

然而,审美差异很大,对许多人来说可能不是一个可以接受的权衡。

我知道其中许多功能仍处于早期阶段,因此一些正在进行的工作可能会为此类案例提前完成性能改进。

从R渲染时间方面来看,通过重新编写plotlyMap()之类的tracify()内部结构以使用data.table来实现更快的排序,在技术上还有改进的余地。当前dplyr::arrange方法及其%chin%函数可以更快地进行字符匹配,但老实说,我认为这可能会更多地落在过早优化的范围内。由于浏览器渲染输出的时间比创建它的R要长,我认为这里的亚秒渲染时间可能不是一个大问题。 (在v4.6.0中的更新之后,在R方面在1-2秒内生成浏览器崩溃图非常容易。)

从HTML有效负载和javascript方面,我确信可以进行改进,但我不知道从哪里开始。

与此同时,一些不错的选项可能会尽可能地对您的数据进行下采样,使用raster包和shiny来处理服务器端而不是浏览器中的繁重工作,或者调查其他工具。

生成数据

library(plotly)
library(data.table)

DT_counties <- setDT(map_data("county"))

## Islands of san juan in washington are represented by 2 groups and throw everything haywire
DT_counties <- DT_counties[!(region == "washington" & subregion == "san juan")]

## Create a coloring based on the raw number of vertices since we don't have population for all
DT_counties[,pop_cat := as.numeric(.N), by = .(group)]
DT_counties[,pop_cat := ordered(cut(pop_cat,10))]

如示例所示:

DT_counties %>% 
  group_by(group) %>%
  plot_geo(x = ~long, y = ~lat, color = ~pop_cat,
           text = ~subregion, 
           mode = "lines",
           colors = c('#ffeda0','#f03b20'),
           hoverinfo = 'text') %>%
  add_polygons(line = list(width = 0.4)) %>%
  add_polygons(
    fillcolor = 'transparent',
    line = list(color = 'black', width = 0.5),
    showlegend = FALSE, hoverinfo = 'none'
  )  %>%
  layout(title = "US Counties by Number of Vertices",
         geo = list(scope = 'usa',
                    showland = TRUE,
                    landcolor = toRGB("gray95"),
                    countrycolor = toRGB("gray80"))) -> Example

htmlwidgets::saveWidget(Example,"tmp_Example.html")

渲染而不会使多边形加倍以获得黑线

DT_counties %>% 
  group_by(group) %>%
  plot_geo() %>%
  add_polygons(x = ~long, y = ~lat, color = ~pop_cat,
               text = ~subregion, 
               colors = c('#ffeda0','#f03b20'),
               hoverinfo = 'text',line = list(width = 0.4)) %>%
  layout(title = "US Counties by Number of Vertices",
         geo = list(scope = 'usa',
                    showland = TRUE,
                    landcolor = toRGB("gray95"),
                    countrycolor = toRGB("gray80"))) -> Small

htmlwidgets::saveWidget(Small,"tmp_Small.html")

视觉比较

with and without line polygons

分析结果(这里的骨头上没有很多肉)

enter image description here