You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为非整数值rast对象定义颜色表并保留原始值?

解决terra栅格非整数值设置coltab时被强制转整数的问题

coltab() 是terra包中为离散整数型栅格设计的颜色映射工具,它仅支持整数与颜色的一一对应。当你给非整数栅格设置颜色表时,terra会自动将栅格值强制转换为整数,这是该函数的固有特性,无法直接让coltab保留原始非整数值。以下是两种可行的替代方案:

方案一:直接用自定义断点+颜色实现映射(推荐)

无需修改原始栅格值,直接在绘图或导出时指定每个非整数值对应的颜色:

library(terra)
# 创建原始非整数栅格
r <- rast(ncols=3, nrows=2, vals=c(0.1,0.5,0.7,1,1.4,1.7))
# 定义值与颜色的对应关系
value_col <- data.frame(
  value = c(0.1,0.5,0.7,1,1.4,1.7),
  col = rainbow(6, end=.9)
)
# 生成断点:在每个值的中间位置设置分割点,确保每个原始值对应唯一颜色
breaks <- c(-Inf, value_col$value + diff(value_col$value)/2, Inf)
# 绘图(关闭默认图例,手动添加更准确的原始值图例)
plot(r, breaks = breaks, col = value_col$col, legend = FALSE)
legend("bottomright", legend = value_col$value, fill = value_col$col, title = "原始值")
# 导出图像示例
png("custom_raster.png", width=800, height=600)
plot(r, breaks = breaks, col = value_col$col, legend = FALSE)
legend("bottomright", legend = value_col$value, fill = value_col$col, title = "原始值")
dev.off()

方案二:映射为整数型栅格后使用coltab

如果必须使用coltab功能,可以将每个非整数值映射为唯一整数,同时保留原始值的映射表:

library(terra)
r <- rast(ncols=3, nrows=2, vals=c(0.1,0.5,0.7,1,1.4,1.7))
# 创建原始值、整数编码、颜色的映射表
value_map <- data.frame(
  original_value = c(0.1,0.5,0.7,1,1.4,1.7),
  int_code = 1:6,
  col = rainbow(6, end=.9)
)
# 将原始栅格转换为整数编码的栅格
r_int <- classify(r, value_map[, c("original_value", "int_code")])
# 设置颜色表
coltab(r_int) <- value_map[, c("int_code", "col")]
# 绘图
plot(r_int)
# 查看颜色表与映射关系,后续可通过value_map恢复原始值
print(coltab(r_int))
print(value_map)

内容的提问来源于stack exchange,提问作者Fabiano Monti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:46:26