如何为非整数值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
相关产品推荐
相关产品推荐

