在R中使用Highcharts绘制新冠疫情世界地图的问题求助
问题描述
我正在分析来自Kaggle的新冠疫情数据,尝试绘制展示总确诊数、新增确诊数、总接种数等不同场景的世界地图。
使用的代码如下:
covid <- fread("covid_data.csv") # 将列名'location'重命名为'region',用于和世界地图数据关联 country_count <- covid %>% group_by(region, total_cases, iso_code) %>% summarise(count=n()) %>% as.data.frame highchart() %>% hc_add_series_map(worldgeojson, df = country_count, value = "total_cases", joinBy = "iso_code") %>% hc_legend(enabled = TRUE) %>% hc_add_theme(hc_theme_db()) %>% hc_mapNavigation(enabled = TRUE) %>% hc_title(text = "Total Cases", style = list(fontSize = "25px")) %>% hc_add_theme(hc_theme_google()) %>% hc_credits(enabled = TRUE,text = "Sources: WHO", style = list(fontSize = "10px"))
目前遇到两个问题:
- 地图加载速度极慢
- 不清楚如何使用
hc_colorAxis根据总确诊数为地图填充对应色调
解决方案
一、用hc_colorAxis实现确诊数与色调的映射
通过hc_colorAxis()可以自定义颜色范围、刻度规则,适配确诊数的数值跨度(多数国家确诊数差异极大,推荐用对数刻度提升区分度):
highchart() %>% hc_add_series_map(worldgeojson, df = country_count, value = "total_cases", joinBy = "iso_code") %>% hc_legend(enabled = TRUE) %>% hc_mapNavigation(enabled = TRUE) %>% hc_title(text = "Total Cases", style = list(fontSize = "25px")) %>% hc_add_theme(hc_theme_google()) %>% hc_credits(enabled = TRUE,text = "Sources: WHO", style = list(fontSize = "10px")) %>% # 新增颜色轴配置 hc_colorAxis( type = "logarithmic", # 对数刻度优化大跨度数值的颜色区分 minColor = "#ffffcc", # 确诊数最小时的浅色调 maxColor = "#800026", # 确诊数最大时的深色调 tickPositions = c(100, 1000, 10000, 100000, 1000000, 10000000), # 自定义显示的刻度点 labels = list(format = "{value}") )
若不需要对数刻度,删除type = "logarithmic"参数,调整tickPositions为线性区间即可。
二、优化地图加载速度的方案
简化GeoJSON地图数据
原始世界地图GeoJSON包含大量精细边界(如小岛),会拖慢加载速度。用rmapshaper包简化数据:library(rmapshaper) # keep参数控制保留原数据的比例,数值越小简化程度越高 simplified_world <- ms_simplify(worldgeojson, keep = 0.1)之后用
simplified_world替代原worldgeojson传入hc_add_series_map。清理冗余数据行
原代码group_by包含total_cases,会导致同一国家的不同确诊数生成多行数据。我们只需要每个国家的最大/最新确诊数,修改数据处理逻辑:country_count <- covid %>% group_by(iso_code, region) %>% summarise(total_cases = max(total_cases, na.rm = TRUE)) %>% # 取每个国家的最大确诊数 as.data.frame()每个国家仅保留一行数据,大幅减少数据量。
移除重复的主题加载
原代码同时调用hc_add_theme(hc_theme_db())和hc_add_theme(hc_theme_google()),后者会覆盖前者,多余调用会增加不必要计算,保留一个主题即可。使用内置轻量地图数据源
highcharter内置了优化后的世界地图数据,加载速度更快:world_data <- get_data_from_map("custom/world")注意匹配数据中的
iso_code与内置地图的iso-a3字段,调整joinBy = c("iso-a3", "iso_code")即可。
内容的提问来源于stack exchange,提问作者Shashivydyula
相关产品推荐
相关产品推荐

