使用ggplot2的geom_sf绘制空间地图时为何点位颜色图例无法显示?
太平洋地图点位图例缺失问题修复方法
问题根源
- 图例缺失的核心原因:直接将手动生成的颜色向量传入
geom_sf()的color静态参数,未通过ggplot的美学机制绑定数据列。ggplot仅对绑定到数据列的美学映射生成图例,静态传值无法建立颜色与对应维度的关联,因此不会渲染图例。 - 此前调整图例位置的代码不生效,是因为不存在可渲染的图例对象,参数调整没有作用载体。
具体修复步骤
- 在点位数据集中新增一列,作为颜色对应的映射维度(可设置为分类变量,也可设置为连续数值变量)
- 在
geom_sf()的mapping = aes()参数中,将新增列绑定到color美学上,替换原来直接传颜色向量的写法 - 搭配对应类型的色阶调整函数,让配色逻辑和原代码的自定义色板匹配
- 待图例正常生成后,调整图例位置的主题代码就会正常生效。
修改后的可运行代码
library(rgeos) library(sf) library(rnaturalearth) library(rnaturalearthdata) library(dplyr) library(ggplot2) library(ggrepel) theme_set( theme_bw() + theme(panel.background = element_rect(fill = "azure"), panel.grid.major = element_blank(), axis.title = element_blank(), axis.text = element_text(size = 8)) ) world <- rnaturalearth::ne_countries(scale = 'medium', returnclass = "sp") box_cut <- bbox2SP(n = 90, s = -90, w = -70, e = 120, proj4string = world@proj4string) world_crop <- gDifference(world, box_cut) pacific_crop <- world_crop %>% st_as_sf() %>% st_shift_longitude() %>% st_crop(c(xmin = st_bbox(.)[["xmin"]], xmax = st_bbox(.)[["xmax"]], ymin = -50, ymax = 30)) tiny_countries <- rnaturalearthdata::tiny_countries50 %>% st_as_sf() %>% st_shift_longitude() %>% st_crop(c(xmin = 120, xmax = 250, ymin = -50, ymax = 30)) %>% bind_cols(st_coordinates(.) %>% as.data.frame()) %>% # 新增颜色对应的连续映射变量,取值范围与色阶匹配 mutate(color_val = seq(0, 1, length.out = nrow(.))) rbPal <- colorRampPalette(c('red','blue')) ggplot() + geom_sf(data = pacific_crop) + # 通过aes绑定颜色映射,替换原来直接传Col的静态写法 geom_sf(data = tiny_countries, mapping = aes(color = color_val), size = 2, show.legend = "point") + # 匹配原自定义红-蓝色阶,自动生成连续图例 scale_color_gradient(low = "red", high = "blue") + # 此时图例正常渲染,位置调整代码可正常生效 theme(legend.position = c(.5,.5))
补充说明
- 若需要展示分类点位图例,只需将映射的连续变量替换为对应分类文本列,搭配
scale_color_manual(values = Col)即可生成分类图例。 - 只要美学映射绑定正确,所有图例相关的调整(位置、标题、样式)均可正常生效。
内容的提问来源于stack exchange,提问作者Tea Tree
相关产品推荐
相关产品推荐

