ggplot地图中按类型重排sf多边形图层,实现鲸类BIA喂食区上层显示
问题核心原因
你调整顺序的操作未生效,主要有两个问题:
- 排序时使用的是
OBJECTID字段,没有按BIA_type字段排序,实际数据框的行顺序并没有实现「洄游区域在前、喂食区域在后」的效果。ggplot2绘制矢量要素时严格按数据框行顺序绘制,越靠后的行对应的要素图层越靠上。 - 颜色设置代码存在匹配错误:你在
aes中映射的是fill=BIA_type,但调用的是scale_color_manual,自定义颜色规则不会生效。
解决方案
方案1:修正排序逻辑(和你原思路一致)
直接按BIA_type字段排序,让所有洄游区域行排在喂食区域行前面:
# 将BIA_type转为有序因子,指定排序优先级:Migration在前,Feeding在后 bia_select$BIA_type <- factor(bia_select$BIA_type, levels = c("Migration", "Feeding")) # 按类型排序,同类型要素可保留原有OBJECTID顺序 bia_select_ordered <- bia_select[order(bia_select$BIA_type, bia_select$OBJECTID), ]
同时将绘图代码中的scale_color_manual改为scale_fill_manual即可。
方案2:拆分图层绘制(逻辑更直观,不易出错)
不需要调整整个数据框顺序,分开两次调用geom_sf,先绘制下层的洄游区域,再绘制上层的喂食区域:
map3 <- ggplot() + geom_sf(data = world, fill = "#CAB7A5") + geom_sf(data = states, fill = "#CAB7A5") + # 先画洄游区域,在下层 geom_sf(data = filter(bia_select, BIA_type == "Migration"), alpha=0.5, aes(fill=BIA_type)) + # 后画喂食区域,在上层 geom_sf(data = filter(bia_select, BIA_type == "Feeding"), alpha=0.5, aes(fill=BIA_type)) + scale_fill_manual(values=bia_colors)+ labs(fill="BIA Type")+ coord_sf( xlim = c(-130,-108), ylim = c(22, 51), expand = FALSE )+ theme_classic()
两种方案都可以实现喂食区域显示在洄游区域上方的效果。
内容的提问来源于stack exchange,提问作者ejoldach
相关产品推荐
相关产品推荐

