如何移除ggplot中geom_sf图例键边框并消除图例垂直间距?
针对geom_sf图例的两个问题解决方案
a) 规范移除图例键内部框线
直接在guides()中针对填充图例(fill),通过override.aes参数把图例键的color设为NA,就能彻底去掉内部边框线,这是官方推荐的规范方法,比临时操作靠谱:
离散填充图例示例
library(ggplot2) library(sf) # 示例数据 nc <- st_read(system.file("shape/nc.shp", package="sf")) ggplot(nc) + geom_sf(aes(fill = AREA, color = AREA)) + # color属性会导致图例键出现内部框线 guides(fill = guide_legend(override.aes = list(color = NA))) # 移除内部框线
连续填充图例示例
如果是连续色阶,用guide_colorbar同样设置override.aes即可:
ggplot(nc) + geom_sf(aes(fill = AREA, color = AREA)) + guides(fill = guide_colorbar(override.aes = list(color = NA)))
b) 消除图例键间的垂直空间
要达到类似guide_colorsteps的紧凑效果,需要同时调整三个参数:
- 在
theme()里把legend.key.spacing.y设为0,去掉键之间的间距 - 把
legend.key的margin设为0,消除键自身的内边距 - 配合调整
key.height(离散图例)或barheight(连续图例)控制键的高度,让它们完全贴合
离散图例紧凑设置示例
ggplot(nc) + geom_sf(aes(fill = cut(AREA, 5), color = cut(AREA, 5))) + guides(fill = guide_legend(override.aes = list(color = NA))) + theme( legend.key.spacing.y = unit(0, "pt"), legend.key = element_rect(margin = margin(0, 0, 0, 0), color = NA), legend.key.height = unit(12, "pt") # 可根据需求调整高度 )
连续图例(仿colorsteps)示例
如果是连续色,直接用guide_colorsteps更省事,同时移除color属性的影响:
ggplot(nc) + geom_sf(aes(fill = AREA, color = AREA)) + guides( fill = guide_colorsteps(override.aes = list(color = NA)), color = "none" # 不需要color图例的话直接隐藏 ) + theme( legend.key.spacing.y = unit(0, "pt"), legend.key = element_rect(margin = margin(0,0,0,0)) )
注意:如果要保留color图例,需要单独处理它的间距,或者直接隐藏避免干扰填充图例的紧凑效果。
内容的提问来源于stack exchange,提问作者dufei
相关产品推荐
相关产品推荐

