ggplot中第二层geom_sf覆盖第一层,fill=NA设置无效的问题
问题与解决方法
问题场景
已通过以下代码成功绘制美国邮政编码级地图(zip_geo为包含wind_group变量的tigris对象):
wind_map <- ggplot()+ geom_sf(data=shift_geometry(zip_geo), aes(fill=wind_group), color=NA)
尝试叠加州轮廓(state_geo2为州级tigris对象)时,使用了如下代码:
wind_map <- ggplot()+ geom_sf(data=shift_geometry(zip_geo), aes(fill=wind_group), color=NA) + geom_sf(data=shift_geometry(state_geo2), aes(fill=NA), color="black")
结果却出现邮政编码地图被覆盖、州以灰色填充并显示黑色描边,同时图例新增灰色“NA”类别的问题。
解决方法
问题核心是将fill=NA放在了aes()映射内,这会让ggplot把NA当作一个数据变量进行映射,覆盖了原有的wind_group填充映射,还生成了多余图例。只需把fill=NA移出aes(),作为图层的直接参数设置即可:
修正后的代码:
wind_map <- ggplot()+ # 绘制邮政编码图层(底层) geom_sf(data=shift_geometry(zip_geo), aes(fill=wind_group), color=NA) + # 叠加州轮廓图层(上层,填充透明,仅显示描边) geom_sf(data=shift_geometry(state_geo2), fill=NA, color="black", size=0.2)
原理说明
- 当
fill参数在aes()内时,ggplot会将其识别为对数据列的映射,这里的NA会被当作一个独立的填充类别,覆盖之前的wind_group映射逻辑。 - 将
fill=NA放在aes()外后,是直接设置该图层的填充为透明,不会干扰底层的填充映射,同时州轮廓会叠加在邮政编码地图上方,达到预期效果。
内容的提问来源于stack exchange,提问作者leviemb
相关产品推荐
相关产品推荐

