在ggplot2中实现含岛屿区分的区域合并图例需求
问题需求
我需要用ggplot2绘制鸟类计数数据的折线图,要求:
- 用线条颜色区分岛屿上的不同区域
- 用线条虚实区分所属岛屿
现有两种方案存在缺陷:
- 双图例方案:区域图例中线条均显示为实线,实际数据有20个区域,难以匹配线条与图例
- 合并图例方案:将颜色和线型均绑定到区域,依赖区域顺序,易出错且丢失岛屿标识
期望实现:生成包含岛屿信息、区域真实线条样式的合并图例,且避免手动编码岛屿。
解决方案
以下是无需手动编码岛屿、自动生成合并图例的实现代码:
library(tidyverse) mydata <- data.frame(Season=c("Year 1", "Year 1", "Year 1", "Year 1", "Year 2", "Year 2", "Year 2", "Year 2", "Year 3", "Year 3", "Year 3", "Year 3", "Year 4", "Year 4", "Year 4", "Year 4"), Op_RegionName=c("Region 1", "Region 2", "Region 3", "Region 4", "Region 1", "Region 2", "Region 3", "Region 4", "Region 1", "Region 2", "Region 3", "Region 4", "Region 1", "Region 2", "Region 3", "Region 4"), Island=c("B", "B", "A", "A", "B", "B", "A", "A", "B", "B", "A", "A", "B", "B", "A", "A"), Total=sample(0:5, 16, replace=TRUE)) regioncolours = c("#B5BDE7", "#B32F48", "#EB8423", "#517F3A") # 自动生成区域对应的线型映射,无需手动编码岛屿 region_linetype <- mydata %>% distinct(Op_RegionName, Island) %>% mutate(linetype = ifelse(Island == "A", 1, 2)) %>% # 可按需调整岛屿对应的线型 deframe() # 生成带岛屿信息的图例标签 region_labels <- mydata %>% distinct(Op_RegionName, Island) %>% mutate(label = str_c(Op_RegionName, " (Island ", Island, ")")) %>% deframe() # 绘制折线图 mydata %>% group_by(Season, Op_RegionName) %>% summarise(n = sum(Total), .groups = "drop") %>% ggplot(aes(Season, n, group=Op_RegionName, col=Op_RegionName, linetype=Op_RegionName)) + geom_line(linewidth=1) + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) + scale_color_manual(values = regioncolours, name = "区域与岛屿", labels = region_labels) + scale_linetype_manual(values = region_linetype, name = "区域与岛屿", labels = region_labels) + xlab("监测季") + ylab("5分钟鸟类计数数量") + theme(panel.background = element_blank(), axis.line = element_line(colour = "black")) + scale_y_continuous(expand = c(0, 0), limits = c(0, NA))
方案说明
- 自动映射线型:从原始数据中提取区域与岛屿的对应关系,自动为不同岛屿分配线型,彻底避免手动指定顺序的错误。
- 合并图例信息:将区域名称与所属岛屿合并为图例标签,单个图例即可同时展示区域颜色、线型及所属岛屿,无需额外图例对照。
- 优化数据处理:用
summarise替代add_count,更清晰地计算每个监测季各区域的总鸟类数量,逻辑更直观。
内容的提问来源于stack exchange,提问作者thestral
相关产品推荐
相关产品推荐

