You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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为线性区间即可。

二、优化地图加载速度的方案

  1. 简化GeoJSON地图数据
    原始世界地图GeoJSON包含大量精细边界(如小岛),会拖慢加载速度。用rmapshaper包简化数据:

    library(rmapshaper)
    # keep参数控制保留原数据的比例,数值越小简化程度越高
    simplified_world <- ms_simplify(worldgeojson, keep = 0.1)
    

    之后用simplified_world替代原worldgeojson传入hc_add_series_map。

  2. 清理冗余数据行
    原代码group_by包含total_cases,会导致同一国家的不同确诊数生成多行数据。我们只需要每个国家的最大/最新确诊数,修改数据处理逻辑:

    country_count <- covid %>% 
      group_by(iso_code, region) %>% 
      summarise(total_cases = max(total_cases, na.rm = TRUE)) %>% # 取每个国家的最大确诊数
      as.data.frame()
    

    每个国家仅保留一行数据,大幅减少数据量。

  3. 移除重复的主题加载
    原代码同时调用hc_add_theme(hc_theme_db())和hc_add_theme(hc_theme_google()),后者会覆盖前者,多余调用会增加不必要计算,保留一个主题即可。

  4. 使用内置轻量地图数据源
    highcharter内置了优化后的世界地图数据,加载速度更快:

    world_data <- get_data_from_map("custom/world")
    

    注意匹配数据中的iso_code与内置地图的iso-a3字段,调整joinBy = c("iso-a3", "iso_code")即可。

内容的提问来源于stack exchange,提问作者Shashivydyula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:15:50