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)
关键改动说明
- 添加图例映射:在
geom_point()的aes()中加入shape = "城市"和shape = "站点",让ggplot将两类点识别为独立图例项,而非单纯的样式设置。 - 关闭文本图例:将
geom_text()的show.legend设为FALSE,避免文本元素混入图例。 - 统一图例样式:用
scale_shape_manual()指定每个分类对应的形状,labs()设置统一的图例标题,确保样式一致,方便后续合并。 - 修复冗余代码:删除原代码中重复的
labs(fill)设置和无效的shape=Legenda参数。
后续图例合并提示
若要将此图例与其他地图图例合并,可:
- 用
cowplot::get_legend()单独提取每个图例 - 借助
cowplot::plot_grid()或patchwork包将多个图例组合成统一布局
内容的提问来源于stack exchange,提问作者Dmoura Silva
相关产品推荐
相关产品推荐

