R语言terra包叠加栅格与点shapefile时无法正常添加图例问题
问题原因
terra 包的绘图逻辑中,当矢量图层以add=TRUE模式叠加在已初始化的栅格绘图面板上时,若未显式指定点形状参数,内置的图例渲染逻辑不会自动触发。手动调用base R的legend()函数时未传入点形状参数,因此仅显示分类文字,不会渲染对应颜色的点标记。
解决方法
方法1:调用terra内置图例渲染
绘图时显式指定点形状参数pch,同时在plg参数列表中传入图例位置等配置,即可自动生成匹配的分类图例:
library(terra) # 读取示例栅格 f <- system.file("ex/elev.tif", package="terra") r <- rast(f) plot(r) # 构造示例点矢量 d <- data.frame(lon=c(6.0,6.1,6.2,6.2), lat = c(49.7,49.8,49.9,49.6), Class=c("Yes", "No")) m <- vect(d, geom=c("lon", "lat"), crs="+proj=longlat +datum=WGS84") # 提前固定分类水平顺序,避免颜色错配 m$Class <- factor(m$Class, levels = c("No", "Yes")) # 叠加点图层并渲染图例 plot(m, add = TRUE, col = c("blue", "red"), # 颜色顺序与因子水平顺序一一对应 pch = 16, # 显式指定实心圆点样式,必须传入否则点图例无法渲染 plg=list( x = "bottomright", legend = levels(m$Class), title = "Class", bty = "o" # 给图例加边框,可按需删除 ))
颜色匹配提示:
col参数的颜色顺序必须和分类字段的水平顺序严格对应,提前手动设置因子水平可以完全避免颜色与类别错位的问题。
方法2:手动调用legend函数添加
如果需要更灵活的图例样式调整,可在绘制完栅格和点图层后,手动调用legend()函数,注意必须传入pch参数指定和绘图时一致的点形状:
# 绘制栅格与点图层,不开启自动图例 plot(r) plot(m, add = TRUE, col = c("blue", "red"), pch = 16) # 手动添加图例 legend("bottomright", legend = levels(m$Class), col = c("blue", "red"), pch = 16, # 核心参数:指定点形状,和绘图时保持一致 title = "Class", bty = "o")
注意事项
- 所有点图层绘图必须显式传入
pch参数指定点样式,不管是自动图例还是手动图例,都依赖该参数渲染点标记 - 不要依赖R默认的字符排序匹配分类与颜色,提前将分类字段转为因子固定水平,是避免图例错配的最稳妥方式
内容的提问来源于stack exchange,提问作者UseR10085
相关产品推荐
相关产品推荐

