R 对于美国县地图来说,情节可视化太慢了

R 对于美国县地图来说,情节可视化太慢了,r,plotly,R,Plotly,我的数据集大约有90K行,其中包含以下列 state_name, county_name, county_lat, count_long, value_x 一个类似的直接例子仅适用于加利福尼亚州的县 虽然它在一个州可以正常工作,但当我在美国所有州都这样做时,当我尝试放大和缩小时,绘图速度很慢,而且悬停数据加载也需要时间。情节生成本身需要一些时间 有没有办法克服这种滞后?如果没有,是否有像plotly这样的交互式绘图具有悬停和缩放功能,并且在绘制地图时视觉上是彩色的?这里的部分问题似乎是plot

我的数据集大约有90K行,其中包含以下列

state_name, county_name, county_lat, count_long, value_x
一个类似的直接例子仅适用于加利福尼亚州的县

虽然它在一个州可以正常工作,但当我在美国所有州都这样做时,当我尝试放大和缩小时,绘图速度很慢,而且悬停数据加载也需要时间。情节生成本身需要一些时间


有没有办法克服这种滞后?如果没有,是否有像
plotly
这样的交互式绘图具有悬停和缩放功能,并且在绘制地图时视觉上是彩色的?

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

您可以做的一个权衡是接受这样一个事实,即不能单独修改线条颜色以避免打印每个多边形两次。通过不只打印线条跟踪,“悬停信息”可以非常平滑地工作,并且对于这组具有约88000个顶点的多边形,缩放时的重新渲染速度略有提高

没有额外的行跟踪的方法的结果.html输出文件(web浏览器交互所需处理量的合理代理)在磁盘上为7.7 MB,而如果使用示例中的方法,则为12.1MB

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

我知道这些特性中的许多仍处于早期阶段,因此,可能一些正在进行的工作将导致此类情况下的性能改进

从R渲染时间方面来看,通过重新编写
plotly
内部构件,如
Map()
tracify()
来使用
数据。表
比当前的
dplyr::arrange
方法排序更快,它的
%chin%
函数用于更快的字符匹配,但老实说,我认为这可能更多地落在过早优化的领域。由于浏览器渲染输出所花费的时间比创建输出所花费的时间要长,因此我认为亚秒级的渲染时间可能不是什么大问题。(在v4.6.0中进行更新后,在R端1-2秒内生成浏览器崩溃图非常容易。)

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

同时,一些不错的选择可能是尽可能地对数据进行下采样,使用
光栅
包和
闪亮
在服务器端而不是在浏览器中处理繁重的工作,或者研究其他工具

生成数据
渲染而不加倍多边形以获得黑线
视觉比较

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

您可能想看一下
传单
闪亮的
:您安装了什么版本的plotly?@mattsumersgill 4.7。1@DJack谢谢我没有在上海工作过。看一看:)嗯。这是一个很难回答的问题,不知道更多的细节——如果你能发布你的代码,使用Profviz配置文件,然后附加Profviz输出,这可能会提供一个更好的起点。谢谢。我现在明白了!作为一个离题的话题,你知道有什么可视化可以无缝地深入到县/市/zipcode级别吗?我能想到的最接近的可能是传单,不确定它如何以这种规模处理添加的多边形。一个有趣的软件包,googlePolylines,我今天刚刚从RStudio Rviews博客上听到,关于一月份的新软件包,听起来确实有潜在的相关性——谷歌空间下采样算法的R端口,它可能会提高性能:我在网上浏览了一些代码,以查看传单。它没有横向和纵向的细节。我不知道如何使用它。你能帮我提供一些示例代码吗。我将拥有属于不同州的同名县。我在这篇文章[链接]()的最后一个答案中尝试了传单代码。但它并没有起作用。我实际上并没有太多地使用传单,我在这方面的知识比地理空间分析的一般领域更集中于情节。我认为,如果你能够发布一个框架良好、深思熟虑、针对传单的问题,你可能会从R空间社区的人们那里得到一些知识渊博的答案!
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")