You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:54:03