这里的部分问题似乎是 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")
视觉对比
分析结果(这里不是很多肉)