使用terra包plet()绘制SpatVector定量字段的绘图异常问题
解决terra包plet()绘制SpatVector定量字段的异常问题
问题1:面SpatVector连续变量颜色刻度异常、图例未排序
运行plet(v, "POP", tiles="")时,POP作为连续数值字段,却出现颜色刻度不合适、图例未排序的情况,这是因为plet()对矢量对象的数值字段默认采用离散分箱且未按数值排序的处理逻辑,和栅格对象的默认处理逻辑不同。
解决方案
手动指定连续色阶与合理断点,或强制按数值排序图例:
- 方法1:使用连续调色板+自定义线性断点
library(terra) v <- vect(system.file("ex/lux.shp", package="terra")) # 调用viridis生成连续渐变调色板 cols <- viridis::viridis(100) # 基于POP的极值生成线性区间断点 breaks <- seq(min(v$POP), max(v$POP), length.out = 101) plet(v, "POP", tiles="", col=cols, breaks=breaks)
- 方法2:用
classInt生成最优分箱,保证图例按数值排序
library(classInt) # 按分位数生成5组分箱(也可选择"equal"等其他分箱方式) ci <- classIntervals(v$POP, n=5, style="quantile") plet(v, "POP", tiles="", col=viridis::viridis(5), breaks=ci$brks)
问题2:点SpatVector定量字段被识别为定性字段
将栅格转为点矢量后,plet(rp, "elevation", tiles="")把连续的elevation当作定性字段处理,这是因为plet()对矢量点对象的数值字段默认按离散类别渲染。
解决方案
通过breaks参数指定连续断点,明确告知函数这是连续变量:
library(terra) r <- rast(system.file("ex/elev.tif", package="terra")) rp <- as.points(r) # 生成连续断点,搭配对应数量的调色板颜色 breaks <- seq(min(rp$elevation), max(rp$elevation), length.out = 20) plet(rp, "elevation", tiles="", col=viridis::viridis(19), breaks=breaks)
也可以直接使用底层的plot()函数(plet()是plot()的简化封装),对连续变量的渲染控制更灵活:
plot(rp, "elevation", col=viridis::viridis(100), pch=16, cex=0.5)
内容的提问来源于stack exchange,提问作者user2955884
相关产品推荐
相关产品推荐

