制作含重叠要素的ggplot2地图并配置图例
物种分布重叠区域可视化及图例配置方案
一、修复当前图例错乱问题
你现在的代码没把季节信息映射到美学属性上,直接用scale_fill_manual会让ggplot找不到对应关系,导致地图格式乱掉。可以通过合并数据+统一映射的方式解决:
- 先给两个季节的数据集加标识列,再合并:
# 假设b是繁殖季数据,m是迁徙季数据,可根据实际修改名称 b$season <- "繁殖季" m$season <- "迁徙季" combined_data <- rbind(b, m)
- 修改ggplot代码,把季节映射到填充和图案属性,统一配置图例:
ggplot() + geom_sf(data = county_sf, fill = NA) + geom_sf_pattern( data = combined_data, aes(fill = season, pattern = season), pattern_colour = "black", pattern_size = 0.01 ) + # 手动设置填充色和图案类型 scale_fill_manual(values = c("繁殖季" = "white", "迁徙季" = "black")) + scale_pattern_manual(values = c("繁殖季" = "stripe", "迁徙季" = "none")) + theme_void() + theme( legend.position = "bottom", legend.title = element_blank() )
这样配置后,ggplot会自动生成对应两种季节样式的图例,不会再乱掉。
二、更清晰的重叠区域可视化方法
如果想让重叠部分辨识度更高,推荐两种实用方法:
- 半透明色叠加:给不同季节分配不同的半透明颜色,重叠区域会呈现混合色,一眼就能看出来:
ggplot() + geom_sf(data = county_sf, fill = NA) + geom_sf(data = b, fill = "#1f77b4", alpha = 0.6) + geom_sf(data = m, fill = "#ff7f0e", alpha = 0.6) + scale_fill_manual(values = c("#1f77b4", "#ff7f0e"), labels = c("繁殖季", "迁徙季")) + theme_void() + theme( legend.position = "bottom", legend.title = element_blank() )
- 多图层独立图例(用ggnewscale):要是不想合并数据,坚持用纯色+图案的组合,可以用
ggnewscale包给每个图层单独做图例:
library(ggnewscale) ggplot() + geom_sf(data = county_sf, fill = NA) + # 第一个图层:带图案的季节 geom_sf_pattern( data = b, aes(fill = "繁殖季"), pattern = "stripe", pattern_fill = "black", pattern_colour = "black", pattern_size = 0.01 ) + scale_fill_manual(values = "white", name = "") + new_scale_fill() # 开启新的填充图例组 # 第二个图层:纯色填充的季节 geom_sf( data = m, aes(fill = "迁徙季"), alpha = 0.5 ) + scale_fill_manual(values = "black", name = "") + theme_void() + theme( legend.position = "bottom", legend.title = element_blank() )
内容的提问来源于stack exchange,提问作者mmoore
相关产品推荐
相关产品推荐

