R语言ggplot2修改geom_rect图例展示不同矩形线型的问题
解决方案
要实现三组矩形的独立图例且正确显示线型,推荐使用ggnewscale包创建多套独立的颜色美学映射,代码实现更简洁清晰。
完整可运行代码
# 未安装ggnewscale的话先执行安装 # install.packages("ggnewscale") library("tidyverse") library("ggplot2") library("sf") library("rnaturalearth") library("rnaturalearthdata") library("ggnewscale") world <- ne_countries(scale = "medium", returnclass = "sf") x1.SST <- c(-2,0,0,-2) x2.SST <- c(5,10,13,15) y1.SST <- c(37,40,36,35) y2.SST <- c(41,45,45,45) x1.WV <- c(1,2.5,-3) x2.WV <- c(5,8,10.25) y1.WV <- c(37.5,39.5,35) y2.WV <- c(40.5,43.75,45) x1.CM <- c(2,1,8) x2.CM <- c(3.5,3.5,14) y1.CM <- c(39,41,45.5) y2.CM <- c(40,44,47.5) d.SST <- data.frame(x1=x1.SST, x2=x2.SST, y1=y1.SST, y2=y2.SST, SST=c('MALL SST','AUD SST','VAIA SST','WMED'), r=c(1,2,3,4)) d.WV <- data.frame(x1=x1.WV, x2=x2.WV, y1=y1.WV, y2=y2.WV, WV=c('MALL WV','AUD WV','VAIA WV'), r=c(1,2,3)) d.CM <- data.frame(x1=x1.CM, x2=x2.CM, y1=y1.CM, y2=y2.CM, CM=c('MALL CM','AUD CM','VAIA CM'), r=c(1,2,3)) ggplot(data = world) + geom_sf(fill = "lavender") + coord_sf(xlim = c(-5, 16), ylim = c(34,48)) + xlab("") + ylab("") + # SST组图例 geom_rect(data=d.SST, aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, colour=SST), fill=NA, alpha=0.5, size=1, linetype = 1) + scale_colour_discrete(name = "SST") + # 新建独立颜色映射,与前组隔离 new_scale_colour() + # WV组图例 geom_rect(data=d.WV, aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, colour=WV), fill=NA, alpha=0.5, size=1, linetype = 2) + scale_colour_discrete(name = "WV") + # 再次新建独立颜色映射 new_scale_colour() + # CM组图例 geom_rect(data=d.CM, aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, colour=CM), fill="blue", alpha=0.2, size=0.5, linetype = 1) + scale_colour_discrete(name = "CM") + # 修正图例样式,显示对应线型和填充 guides( colour = guide_legend(override.aes = list( linetype = c(rep(1,4), rep(2,3), rep(1,3)), fill = c(rep(NA,7), rep("blue",3)) )) ) + theme_light()
关键调整说明
new_scale_colour()会重置ggplot的颜色美学映射,后续的颜色映射会生成独立图例,自动实现SST、WV、CM三个图例的拆分guides中的override.aes参数手动指定每个图例项的线型和填充属性,保证未填充的矩形图例不会显示填充色,同时对应线型正确展示- 可以根据需求替换
scale_colour_discrete为scale_colour_manual自定义各组的颜色方案
内容的提问来源于stack exchange,提问作者pacomet
相关产品推荐
相关产品推荐

