如何使用WorldMapR(或类似工具包)绘制按国家划分的H5N1病例患病率热力图
如何使用WorldMapR(或类似工具包)绘制按国家划分的H5N1病例患病率热力图
嘿,看起来你在尝试用WorldMapR的worldplot函数制作H5N1病例的国家热力图,我来帮你排查下现存问题,再给你梳理清晰的实现步骤~
首先排查你的数据和代码里的核心问题
国家编码与名称不匹配
我注意到你数据里的iso_a2和Country列对应关系有错误!比如第一个条目:iso_a2是"AF"(对应阿富汗Afghanistan),但Country写的是"Azerbaijan"(阿塞拜疆,正确二字码是"AZ")。这种不匹配会导致地图完全无法正确关联国家,是必须先修正的问题——你要确保每一行的iso_a2都和对应的国家名称严格对应,可以查ISO 3166-1二位码表来核对。缺少关键的病例数值列
你的数据结构里只有iso_a2和Country两列,但worldplot函数的ColName参数指定的是"Cases"——也就是说函数需要一个存储病例数的数值列来生成热力颜色,你现在的数据集里根本没有这个列,必须补上包含H5N1病例数的Cases列才行。
修正后的WorldMapR实现步骤
1. 先搞定数据修正
先把国家编码和名称对应正确,再补上Cases列,比如修正后的示例数据大概是这样:
# 修正后的数据集(示例) Underlag_heatmap <- structure(list( iso_a2 = c("AZ", "BD", "KH", "CA", "CL", "CN", "DJ", "EC", "EG", "IN", "ID", "IQ", "LA", "MM", "NP", "NG", "PK", "ES", "TH", "TR", "GB", "US", "VN"), Country = c("Azerbaijan", "Bangladesh", "Cambodia", "Canada", "Chile", "China", "Djibouti", "Ecuador", "Egypt", "India", "Indonesia", "Iraq", "Lao People's Democratic Republic", "Myanmar", "Nepal", "Nigeria", "Pakistan", "Spain", "Thailand", "Turkey", "United Kingdom", "United States", "Viet Nam"), Cases = c(5, 12, 8, 3, 1, 20, 2, 1, 45, 7, 18, 1, 3, 5, 4, 6, 9, 2, 10, 3, 4, 8, 15) # 这里替换成你的实际病例数 ), class = "data.frame", row.names = c(NA, -23L))
2. 安装加载WorldMapR
如果你还没装这个包,先安装加载:
install.packages("WorldMapR") library(WorldMapR)
3. 调整参数后运行worldplot
我给你调整了几个参数让热力图更合理:
worldplot( data = Underlag_heatmap, div = 5, # 把颜色分成5个梯度,比div=1的单色渐变更易区分 ColName = "Cases", CountryName = "iso_a2", CountryNameType = "isoa2", rangeVal = c(0, 50), # 这个范围要和你的实际病例数最大值匹配,我用示例数据的45设到50 title = "H5N1病例数国家热力图" # 加上标题更清晰 )
要是WorldMapR不好用,试试主流的ggplot2方案
如果WorldMapR出现兼容性问题,用ggplot2配合rnaturalearth是R里更通用的地图绘制方案,步骤也很清晰:
1. 安装加载依赖包
install.packages(c("ggplot2", "rnaturalearth", "rnaturalearthdata")) library(ggplot2) library(rnaturalearth)
2. 合并地图数据和你的病例数据
# 获取中等精度的世界地图数据 world_map <- ne_countries(scale = "medium", returnclass = "sf") # 合并地图数据和你的病例数据,用iso_a2关联 merged_data <- merge(world_map, Underlag_heatmap, by.x = "iso_a2", by.y = "iso_a2", all.x = TRUE)
3. 绘制热力图
ggplot(data = merged_data) + geom_sf(aes(fill = Cases)) + # 用viridis颜色渐变,把没有数据的国家设为浅灰色 scale_fill_viridis_c(option = "plasma", na.value = "lightgray", limits = c(0, 50)) + labs(title = "H5N1病例数国家热力图", fill = "病例数") + theme_minimal() + # 去掉坐标轴的文字和刻度,让地图更干净 theme(axis.text = element_blank(), axis.ticks = element_blank())
备注:内容来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

