如何为ggplot2绘制的地图添加含区域名称的自定义图例?
自定义地图图例实现方案
需求
用ggplot2绘制地图时,基于连续字段(如实际代码中的Y1)为区域着色,替换默认的连续渐变图例,改为显示区域名称、对应数值及匹配地图颜色的自定义图例。
场景重现(用公开数据测试)
先通过公开地理数据模拟你的场景:
library(ggplot2) library(sf) library(gridExtra) # 读取地理数据(替换为你的自有shapefile/geojson路径) map <- read_sf("你的地理文件路径") # 测试时可使用西班牙公开地理数据,字段对应名称为`name`、失业率字段为`unemp_rate`
实现步骤
1. 绘制不带默认图例的地图
# 基础地图(隐藏默认图例) map_plot <- ggplot(map, aes(geometry = geometry, fill = unemp_rate)) + geom_sf(color = "white", show.legend = FALSE) + # 对应你实际代码的渐变配色 scale_fill_gradient2(low = "brown", high = "green", midpoint = median(map$unemp_rate)) + theme_bw() + theme( axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), plot.margin = margin(10, 10, 10, 10) )
2. 生成自定义图例
单独用ggplot绘制表格样式的图例,确保颜色与地图匹配:
# 整理图例数据:提取名称、数值,计算对应颜色 legend_data <- map %>% st_drop_geometry() %>% # 移除地理属性,保留数据列 select(name, unemp_rate) %>% arrange(unemp_rate) %>% # 按数值排序(可选,优化视觉效果) mutate( # 根据渐变规则计算每个区域的匹配颜色 fill_color = scales::gradient_n_pal(c("brown", "green"))(scales::rescale(unemp_rate, to = c(0,1))), name = factor(name, levels = name) # 锁定排序,避免图例乱序 ) # 绘制自定义图例 custom_legend <- ggplot(legend_data, aes(y = name)) + # 绘制颜色块 geom_tile(aes(x = 1, fill = fill_color), width = 0.8) + # 添加数值标签 geom_text(aes(x = 1.8, label = sprintf("%.1f", unemp_rate)), size = 3) + # 添加区域名称标签 geom_text(aes(x = 0.2, label = name), hjust = 0, size = 3) + scale_fill_identity() + # 使用已计算的颜色值,不生成新图例 theme_void() + theme( plot.margin = margin(10, 10, 10, 10), plot.title = element_text(hjust = 0.5, size = 10, face = "bold") ) + labs(title = "失业率(%)") + coord_cartesian(xlim = c(0, 2)) # 控制图例的宽度范围
3. 拼接地图与图例
用grid.arrange组合两者,调整宽度比例让布局更协调:
gridExtra::grid.arrange(map_plot, custom_legend, ncol = 2, widths = c(3, 1))
适配你的实际代码
只需将上述代码中的unemp_rate替换为你的Y1字段,同时可根据需求调整配色方案、文字大小、图例宽度比例等参数。
内容的提问来源于stack exchange,提问作者Mankka
相关产品推荐
相关产品推荐

