对于美国县级地图,绘图可视化太慢

Posted

技术标签:

【中文标题】对于美国县级地图,绘图可视化太慢【英文标题】:plotly visualisation is too slow for United states county map 【发布时间】:2018-02-22 06:56:36 【问题描述】:

我的数据集有大约 90K 行和以下列

state_name, county_name, county_lat, count_long, value_x

类似的直接示例仅适用于加利福尼亚县here

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

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

【问题讨论】:

你可能想看看leafletshiny:rstudio.github.io/leaflet/shiny.html 你安装了什么版本的plotly? @MattSummersgill 4.7.1 @DJack 谢谢。我没有在闪亮的地方工作过。会看看:) 嗯。在不了解更多细节的情况下很难回答 - 如果您可以发布您的代码,使用 Profvis 配置文件,然后附加可能提供更好起点的 Profviz 输出。 【参考方案1】:

这里的部分问题似乎是 plotly R API 似乎不支持使用不同的颜色来填充多边形特征和边框。

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

生成的 .html 输出文件 (对于 Web 浏览器交互需要多少处理的体面的代理) 没有额外行跟踪的方法在磁盘上是 7.7 MB,而如果是 12.1 MB您使用示例中的方法。

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

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

从 R 渲染时方面来看,通过重写 plotly 内部结构(如 Map()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")

视觉对比


分析结果(这里不是很多肉)


【讨论】:

谢谢。我现在明白了!作为一个题外话,您知道任何可以将州无缝深入到县/市/邮政编码级别的可视化吗? 我能想到的最接近的可能是传单,不确定它如何处理这种比例的添加多边形。一个有趣的包 googlePolylines,我今天刚刚从 RStudio Rviews 博客中听到关于 1 月份新包的消息,这听起来确实可能相关 - 谷歌空间下采样算法的 R 端口,可能会提高性能:cran.rstudio.com/web/packages/googlePolylines/vignettes/… 我在网上浏览了一些代码来查看传单。它没有经纬度的详细信息。我不确定如何使用它。你能帮我提供任何示例代码吗?我将有属于不同州的同名县。我在这篇文章 [链接] (***.com/questions/17243031/…) 的最后一个答案中尝试了传单代码。但它没有用。 我并没有真正使用过传单,我对这方面的了解更多地集中在 Plotly 上,而不是地理空间分析的一般领域。我认为,如果您能够发布一个精心设计、深思熟虑、传单的特定问题,您也许可以从 R 空间社区的人们那里得到一些知识渊博的答案!

以上是关于对于美国县级地图,绘图可视化太慢的主要内容,如果未能解决你的问题,请参考以下文章

使用美国县级数据创建 Choropleth 地图

[原创.数据可视化系列之二]使用cesium三维地图展示美国全球军事基地分布

Python-气象-大气科学-可视化绘图系列—— 地图上自动标注省会名称(demo调整中)(代码+示例)

数据可视化应用绘制空间地图(附R语言代码)

有没有地理信息可视化的绘图软件

国内首款-数据可视化参考手册:专业绘图必备