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

ggplot2地图图例优化:分离城市与站点标记并实现多图共用图例

解决ggplot2地图图例分离问题

要将“城市”和“站点”标记从填充图例中分离出来,生成独立且便于后续合并的图例,可按以下方式修改代码:

核心调整思路

  • 为点标记在aes()中映射虚拟分类变量,让ggplot自动生成独立图例
  • 关闭文本标签的图例显示,避免干扰
  • 手动指定标记样式与图例名称,统一格式

修改后的完整代码

library(ggplot2)
library(sf)
library(ggspatial)

ggplot() +
  # 区域填充图层
  geom_sf(data = pernambuco_shapefile, aes(fill = NM_MESO), color = "black") +
  scale_fill_manual(
    values = c("lightblue", "lightgreen", "mediumorchid", "tomato1", "orange2"),
    labels = c("Agreste Pernambucano", "Mata Pernambucana", "Metropolitana do Recife",
               "São Francisco Pernambucano", "Sertão Pernambucano")
  ) +
  # 坐标系与主题设置
  coord_sf(crs = st_crs(4326)) +
  labs(
    title = "Divisões de Pernambuco",
    fill = bquote(bold("Mesoregiões de Pernambuco")),
    shape = bquote(bold("标记类型")) # 点标记图例标题
  ) +
  theme_minimal() +
  theme(legend.title = element_text(face = "bold")) +
  # 地图辅助元素
  annotation_scale(location = "br") +
  annotation_north_arrow(which_north = "grid") +
  # 城市点标记:通过aes映射分类生成图例
  geom_point(data = coord_cidades, aes(x = Longitude, y = Latitude, shape = "城市"), 
             color = "black", size = 3) +
  # 城市文本标签:关闭图例显示
  geom_text(data = coord_cidades, aes(x = Longitude, y = Latitude, label = cidade), 
            color = "black", size = 4, 
            nudge_x = c(0.4, 0.25, 0.25, 0, 0.4), 
            nudge_y = c(0, 0, -0.05, 0.12, 0), 
            show.legend = FALSE) +
  # 站点点标记:通过aes映射分类生成图例
  geom_point(data = coord_estacoes, aes(x = Longitude, y = Latitude, shape = "站点"), 
             color = "red", size = 3) +
  # 手动指定标记形状与图例项
  scale_shape_manual(
    values = c("城市" = 19, "站点" = 8),
    labels = c("城市", "站点")
  ) +
  # 坐标范围
  xlim(-41.5, -34) +  
  ylim(-9.5, -7)

关键改动说明

  1. 添加图例映射:在geom_point()的aes()中加入shape = "城市"和shape = "站点",让ggplot将两类点识别为独立图例项,而非单纯的样式设置。
  2. 关闭文本图例:将geom_text()的show.legend设为FALSE,避免文本元素混入图例。
  3. 统一图例样式:用scale_shape_manual()指定每个分类对应的形状,labs()设置统一的图例标题,确保样式一致,方便后续合并。
  4. 修复冗余代码:删除原代码中重复的labs(fill)设置和无效的shape=Legenda参数。

后续图例合并提示

若要将此图例与其他地图图例合并,可:

  • 用cowplot::get_legend()单独提取每个图例
  • 借助cowplot::plot_grid()或patchwork包将多个图例组合成统一布局

内容的提问来源于stack exchange,提问作者Dmoura Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:02:08