新西兰某物种阈值型生境适宜性地图制作问题求助
生境适宜性地图阈值可视化问题解决方法
我正在为新西兰某物种制作生境适宜性(HS)地图,需求是仅展示阈值以上区域的分级效果,而非全区域热力图。阈值设置为观测点HS值减去0.05,但遇到两个问题:
- 将低于阈值的区域设为0后,地图高适宜性区域颜色偏深,但希望刚达标的区域颜色更浅;
- 将低于阈值区域设为NA时,分级热力图生效,但包括面板背景在内的所有区域都变灰,叠加新西兰边界的
geom_sf图层也无法解决。
核心解决思路
先把低于阈值的区域设为NA(保留有效分级的HS值),再通过调整ggplot图层顺序、背景色和颜色映射规则,解决背景变灰问题,同时实现“刚达标区域浅、高适宜区域深”的分级效果。
具体修改步骤
1. 修正栅格数据处理逻辑
直接把低于阈值的区域设为NA,同时用新西兰边界裁剪并遮罩栅格,只保留境内的有效数据:
# 计算阈值 threshold <- observed_hss[1,1] - 0.05 # 保留阈值以上的HS值,低于的设为NA hs_raster <- ifel(y2 < threshold, NA, y2) # 裁剪+遮罩,只保留新西兰境内的栅格数据 hs_raster_nz <- terra::mask(terra::crop(hs_raster, nz_map), nz_map)
2. 调整ggplot绘图代码
重点调整图层顺序、背景色和颜色映射,解决背景灰、颜色深浅颠倒的问题:
# 自定义渐变色(如果默认的caw_seq_4起始色不够浅,可以手动替换) custom_pal <- get_pal("caw_seq_4") # 示例手动浅色调:custom_pal <- c("#f0f8ff", "#87ceeb", "#4682b4", "#1e3a8a") binary_p <- ggplot() + # 先设置面板样式,背景设为白色 theme_bw() + theme( panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_rect(fill = "white") ) + # 先画新西兰边界(填充白色,作为底图) geom_sf(data = nz_map, fill = "white", color = "black") + # 叠加处理后的境内栅格 geom_spatraster(data = hs_raster_nz, maxcell = 3e5, interpolate = T) + # 设置颜色映射:从阈值到最大值渐变,NA区域透明 scale_fill_gradientn( colours = custom_pal, na.value = "transparent", limits = c(threshold, max(y2[], na.rm = TRUE)), breaks = seq(threshold, max(y2[], na.rm = TRUE), length.out = 4), labels = function(x) round(x, 2) ) + # 用coord_sf适配空间数据,替代coord_fixed coord_sf(expand = c(0.01, 0.01)) + labs( fill = "生境适宜性", x = "经度", y = "纬度" )
关键说明
terra::mask能彻底过滤境外区域,避免NA区域干扰;- 图层顺序必须是“背景→边界→栅格”,NA区域透明后会显示下方的白色边界,不会出现全灰;
scale_fill_gradientn的limits参数限定颜色从阈值开始映射,刚达标的区域自然对应最浅的颜色,高值对应深色;coord_sf比coord_fixed更适配空间图层,避免坐标错位。
内容的提问来源于stack exchange,提问作者rose_rox
相关产品推荐
相关产品推荐

