如何将数据框非映射元素添加至含映射元素的ggplot图例?
为ggplot地图添加总分构成变量的自定义图例
核心思路
由于这5个构成变量不需要映射到多边形图形上,我们可以通过**虚拟图层(geom_blank)**配合自定义比例尺的方式,手动生成说明总分构成的图例。同时先修正原代码中不规范的列引用方式(避免直接用minstore$,改用数据框列名)。
方案一:添加离散线条型构成图例
适合用线条区分构成变量的场景,步骤如下:
- 先定义构成变量的显示名称和对应颜色(可自定义):
# 替换成你的5个变量名称和偏好颜色 legend_info <- data.frame( component = c("维度1", "维度2", "维度3", "维度4", "维度5"), line_color = c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2") )
- 修改ggplot代码:
ggplot() + # 底图图层 annotation_map_tile(zoomin = 0, type = "osm") + # LSOA总分多边形图层(修正列引用方式) geom_sf(data = alljoined, aes(geometry = joinlsoageometry, fill = totscrtot), alpha = 0.7) + # 添加虚拟图层,用于触发构成变量图例生成 geom_blank(data = legend_info, aes(color = component)) + # 总分填充色标设置 scale_fill_viridis_c(name = "区域平均总分", reverse = TRUE) + # 构成变量颜色标设置 scale_color_manual( name = "总分构成维度", values = setNames(legend_info$line_color, legend_info$component) ) + # 调整图例顺序与布局 guides( fill = guide_colorbar(order = 1), # 总分图例优先显示 color = guide_legend(order = 2) # 构成图例后置 ) + theme(legend.position = "right") # 可按需修改位置,如"bottom"
方案二:添加离散色块型构成图例(双填充图例)
如果需要用色块展示构成变量,由于ggplot默认只能有一个填充比例尺,需借助ggnewscale包实现双填充图例:
- 先安装并加载包:
install.packages("ggnewscale") library(ggnewscale)
- 定义构成变量信息:
legend_info <- data.frame( component = c("维度1", "维度2", "维度3", "维度4", "维度5"), fill_color = c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2") )
- 修改ggplot代码:
ggplot() + annotation_map_tile(zoomin = 0, type = "osm") + # 总分多边形图层 geom_sf(data = alljoined, aes(geometry = joinlsoageometry, fill = totscrtot), alpha = 0.7) + # 总分填充色标 scale_fill_viridis_c(name = "区域平均总分", reverse = TRUE) + # 开启新的填充比例尺,避免与总分填充冲突 new_scale_fill() + # 虚拟图层触发构成色块图例 geom_blank(data = legend_info, aes(fill = component)) + # 构成变量填充色标 scale_fill_manual( name = "总分构成维度", values = setNames(legend_info$fill_color, legend_info$component) ) + # 调整图例顺序 guides( fill = guide_legend(order = 2) )
关键注意事项
- 原代码中
aes(geometry = minstore$joinlsoageometry)的写法不规范:geom_sf已指定data = alljoined,直接写列名joinlsoageometry即可,否则可能引发数据匹配错误。 - 颜色可自由替换,比如使用
RColorBrewer包的配色(如brewer.pal(5, "Set1"))。
内容的提问来源于stack exchange,提问作者JMW
相关产品推荐
相关产品推荐

