在R中创建植物物种罗宾逊分布图:多边形等问题求助
解决方案:植物物种分布图绘制与批量处理
一、地图优化(解决重叠、杂乱、隐藏南极洲)
参考你想要的简洁风格地图,可通过以下步骤优化:
- 移除南极洲:从shp数据中直接筛选掉名称为"Antarctica"的区域
- 简化细碎多边形:用
st_simplify()合并小岛屿或过度细分的区域,减少视觉杂乱感 - 替换为Level2数据:WGS84的Level3数据北极区域存在重复多边形,改用Level2数据(区域划分更宏观),能直接避免北极重叠问题,更贴合参考图的简洁效果
二、修复现有代码错误
你的代码中存在变量名不一致的问题,修正如下:
# 原错误代码 tdwg.introduced.name <- list() for (i in 1:length(introduced)){ tdwg.introduced.code[[i]]<- introduced[[i]]$name # 使用了未定义的tdwg.introduced.code } tdwg.introduced.name <- unlist(tdwg.introduced.code) # 同样变量名错误 # 修正后代码 tdwg.introduced.name <- list() for (i in 1:length(introduced)){ tdwg.introduced.name[[i]] <- introduced[[i]]$name } tdwg.introduced.name <- unlist(tdwg.introduced.name)
三、批量处理100种物种的方案
将物种ID存入向量,编写通用绘图函数,通过循环自动获取每个物种的分布数据、生成地图并保存图片。
完整示例代码
# 加载依赖包 library(kewr) library(sf) library(ggplot2) library(dplyr) # 1. 预处理地图数据 # 读取Level2 shp文件(比Level3更简洁) tdwg_level2.shp <- read_sf("wgsrpd-master/level2/level2.shp") # 转换为罗宾逊投影 tdwg_robinson <- st_transform(tdwg_level2.shp, crs = "+proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs") # 移除南极洲+简化多边形 tdwg_clean <- tdwg_robinson %>% filter(LEVEL2_NAM != "Antarctica") %>% st_simplify(dTolerance = 10000) # 10000米容差,数值越大简化程度越高 # 2. 定义单物种绘图函数 plot_species_dist <- function(species_id, save_dir = "./species_plots/") { # 创建保存目录 if (!dir.exists(save_dir)) dir.create(save_dir) # 获取POWO分布数据 powo_data <- lookup_powo(species_id, distribution = TRUE) # 提取原生/引入区域名称 native_regions <- if (!is.null(powo_data$distribution$natives)) { unlist(lapply(powo_data$distribution$natives, function(x) x$name)) } else character(0) introduced_regions <- if (!is.null(powo_data$distribution$introduced)) { unlist(lapply(powo_data$distribution$introduced, function(x) x$name)) } else character(0) # 给地图数据标记分布类型 plot_data <- tdwg_clean %>% mutate( dist_type = case_when( LEVEL2_NAM %in% native_regions ~ "原生分布", LEVEL2_NAM %in% introduced_regions ~ "引入分布", TRUE ~ "无分布" ) ) # 绘制地图 p <- ggplot() + geom_sf(data = plot_data %>% filter(dist_type == "无分布"), fill = "#f0f0f0", color = "#cccccc") + geom_sf(data = plot_data %>% filter(dist_type == "原生分布"), fill = "#B8DE95", color = "#cccccc") + geom_sf(data = plot_data %>% filter(dist_type == "引入分布"), fill = "#9F6CCC", color = "#cccccc") + theme_void() + labs(title = powo_data$taxon$name) + theme(plot.title = element_text(hjust = 0.5, size = 14)) # 保存图片 ggsave(paste0(save_dir, powo_data$taxon$name, ".png"), p, width = 12, height = 6, dpi = 300) return(p) } # 3. 批量处理物种ID列表 id_list <- c("17414550-1", "296290-1", "263221-1") # 循环生成所有物种地图 lapply(id_list, plot_species_dist)
关键说明
- 用Level2数据替代Level3:从根源避免北极重叠和细碎区域问题,输出效果更接近参考图
- 多边形简化参数:
st_simplify()的dTolerance可根据需求调整,单位为米 - 空分布处理:函数中加入了原生/引入分布为空的判断,避免运行报错
- 批量管理:自动创建保存目录,每个地图以物种名称命名,便于后续整理
内容的提问来源于stack exchange,提问作者Manuel Tiburtini
相关产品推荐
相关产品推荐

