如何在ggplot2绘制的地图下方添加国家名称图例?
在ggplot2世界地图下方添加国家名称图例
要实现地图下方显示国家名称的图例,你可以通过添加辅助图层生成离散图例,再调整图例的位置与样式来达成需求。以下是具体实现方案:
实现代码
library(maps) library(ggplot2) # 你的数据集 trend_country_freq <- structure(list(country = c("US", "CN", "KR", "IN", "AU", "GB", "JP"), n = c(25L, 20L, 12L, 5L, 2L, 1L, 1L), country_name = c("USA", "China", "South Korea", "India", "Australia", "UK", "Japan")), row.names = c(1L, 2L, 3L, 4L, 5L, 7L, 8L), class = "data.frame") world_map <- map_data("world") world_map <- subset(world_map, region != "Antarctica") ggplot(trend_country_freq) + # 绘制基础空白世界地图 geom_map( data = world_map, map = world_map, aes(map_id = region), fill = "white", color = "#7f7f7f", size = 0.25 ) + # 绘制带事件频次的国家填充 geom_map(map = world_map, aes(map_id = country_name, fill = n), size = 0.25) + # 辅助图层:生成国家名称图例(点设为透明,不在地图上显示) geom_point(aes(x = NA, y = NA, color = country_name), alpha = 0) + # 调整事件频次的填充渐变图例 scale_fill_gradient(low = "#fff7bc", high = "#cc4c02", name = "Total Cases") + # 配置国家名称的离散图例 scale_color_discrete(name = "Countries") + # 确保地图显示完整范围 expand_limits(x = world_map$long, y = world_map$lat) + # 优化主题样式 theme_minimal() + theme( panel.grid = element_blank(), axis.title = element_blank(), axis.ticks = element_blank(), axis.text = element_blank(), # 调整图例布局:频次图例右上,国家图例下方水平排列 legend.position = c(1, 1), legend.justification = c(1, 1), legend.box = "vertical", legend.box.just = "bottom", legend.direction = "horizontal", # 调整图例间距,确保国家图例显示在地图下方 legend.margin = margin(t = 30, b = 10), legend.box.margin = margin(b = 20) )
关键步骤说明
- 添加辅助图层:用
geom_point创建一个完全透明(alpha=0)的点图层,通过color = country_name映射国家名称,这样不会在地图上显示多余元素,但会生成对应的离散图例。 - 配置图例样式:
scale_color_discrete设置国家图例的标题- 通过
theme调整图例位置:将频次图例固定在右上角,国家图例设为水平排列并通过margin参数移到地图下方
- 优化主题:移除坐标轴、网格线等冗余元素,保持地图简洁。
如果希望国家图例的符号更贴合地图(比如用小矩形代替圆点),可以把geom_point替换为geom_rect,设置透明填充和对应边框:
geom_rect(aes(xmin=NA, xmax=NA, ymin=NA, ymax=NA, color = country_name), alpha=0)
内容的提问来源于stack exchange,提问作者Ane
相关产品推荐
相关产品推荐

