如何用R语言基于入侵事件频次为世界生物地理区地图着色?
解决方案
1. 修正入侵事件数据的核心问题
你用cbind()创建的invasion_df是矩阵类型,Freq会被强制转为字符型,更关键的是区域名称和shapefile中的REALM字段不匹配(比如你定义的Australasia输出后变成Australian,Afrotropic变成Ethiopian,Indomalayan变成Oriental),这是数据无法关联的根本原因。
先重新整理数据,确保名称和shapefile一致,同时转为数据框并保证Freq是数值型:
# 先运行 unique(mapa$REALM) 查看shapefile里的正确区域名称,再对应调整Var1 invasion_df <- data.frame( Var1 = c("Australian", "Ethiopian", "Neartic", "Neotropical", "not applicable", "Oriental", "Paleartic", "Antarctica", "Oceania"), Freq = c(70, 25, 219, 154, 7, 9, 356, 0, 0), stringsAsFactors = FALSE )
2. 关联地理数据与入侵数据
用dplyr的left_join把shapefile数据和入侵数据按区域名称关联:
library(dplyr) library(ggplot2) library(sf) # 按区域名称关联,确保对应列名匹配(mapa的区域列是REALM,invasion_df是Var1) mapa_joined <- left_join(mapa, invasion_df, by = c("REALM" = "Var1"))
3. 绘制热力图
用关联后的数据,按Freq值填充颜色生成热力图:
ggplot() + geom_sf(data = mapa_joined, aes(fill = Freq), alpha = 0.8) + # 选用色盲友好的viridis配色,适合热力图展示 scale_fill_viridis_c(option = "plasma", name = "入侵事件频次") + labs(title = "世界生物地理区入侵事件热力图", x = "", y = "") + theme_minimal()
补充处理
如果关联后有区域的Freq为NA,可以用replace_na填充为0:
mapa_joined <- mapa_joined %>% mutate(Freq = replace_na(Freq, 0))
内容的提问来源于stack exchange,提问作者Luddy
相关产品推荐
相关产品推荐

