ggplot/geom_sf无美学映射时如何自定义绘制图例?
解决geom_sf无美学映射时生成自定义图例的问题
我明白你遇到的痛点了——当用geom_sf绘制没有映射美学属性的简单地图时,确实没法直接通过show.legend=TRUE生成图例,不过咱们有几种靠谱的解决办法,既能保留你想要的图层颜色,又能生成带名称的图例:
方法1:手动colour映射+统一颜色设置
核心思路是通过在aes()里临时映射一个固定字符串触发图例,同时在外部设置图层的实际颜色,最后用颜色标度统一图例和图层的颜色:
library(ggplot2) library(sf) nc <- st_read(system.file("shape/nc.shp", package = "sf")) ggplot(nc) + # 在aes里映射colour到自定义名称,同时外部设置图层颜色为grey geom_sf(aes(colour = "US State borders"), colour = "grey", show.legend = "line") + # 手动指定图例的颜色和名称(这里name设为空就会用映射的字符串当标题) scale_colour_manual(values = "grey", name = "")
这个方法逻辑清晰,不会干扰其他图层的美学映射,图例里会显示和地图边框同色的灰色线条,标题就是你设置的"US State borders"。
方法2:用guides自定义图例
如果你的地图有其他图层,或者想更灵活控制图例样式,可以用guides()函数手动生成图例:
ggplot(nc) + # 先设置图层颜色,指定show.legend为line类型 geom_sf(colour = "grey", show.legend = "line") + # 自定义图例的标题和显示颜色 guides(colour = guide_legend( title = "US State borders", override.aes = list(colour = "grey") )) + # 设置图例的标签(确保图例能正常显示) scale_colour_discrete(breaks = "US State borders")
为什么之前的方案出问题?
你之前尝试用fill映射,但geom_sf的fill是控制面的填充色,而你要的是边框线条,应该用colour属性;另外重复设置fill会覆盖aes()里的映射,导致图例失去触发条件而消失,换成colour就不会有这个冲突啦。
内容的提问来源于stack exchange,提问作者M.Teich
相关产品推荐
相关产品推荐

