如何用ggplot2+geom_spatraster实现栅格颜色面板分层截断?
在ggplot2中实现栅格颜色的区间截断(无需重分类数据)
可以通过scale_fill_gradientn()结合values参数实现多区间颜色映射,无需修改原始栅格数据。以下是具体步骤和示例代码:
步骤1:计算关键统计量
先用terra工具计算栅格的最小值、99分位数和最大值:
library(ggplot2) library(terra) library(scales) # 创建示例栅格(替换为你的实际栅格) r <- rast(nrow=100, ncol=100) values(r) <- rnorm(10000, mean=50, sd=20) # 定义区间参数 low.val <- 10 # 自定义低区间截断值 zmin <- global(r, "min", na.rm=TRUE)[[1]] q99 <- global(r, function(x) quantile(x, 0.99, na.rm=TRUE))[[1]] zmax <- global(r, "max", na.rm=TRUE)[[1]]
步骤2:转换栅格为数据框
ggplot需要数据框格式的输入:
r_df <- as.data.frame(r, xy=TRUE) colnames(r_df)[3] <- "value" # 重命名数值列方便调用
步骤3:ggplot绘图并设置颜色映射
核心是用scale_fill_gradientn()的values参数指定颜色对应的数值断点,实现区间颜色分割:
ggplot(r_df, aes(x=x, y=y, fill=value)) + geom_raster() + scale_fill_gradientn( # 定义三个区间的颜色:低区间纯色、中间连续色板、高区间纯色 colors = c("#2c7fb8", viridis::viridis(100), "#d95f02"), # 将数值区间转换为0-1范围,对应颜色的位置 values = rescale(c(low.val, zmin, q99, zmax)), # 设置颜色映射的数值范围 limits = c(low.val, zmax), # 处理超出limits的值(确保所有值都被正确映射) oob = squish, # 设置图例断点和标签 breaks = c(low.val, zmin, q99, zmax), labels = c( paste0("低区间\n(", low.val, " - ", round(zmin,1), ")"), paste0("中间区间\n(", round(zmin,1), " - ", round(q99,1), ")"), paste0("高区间\n(", round(q99,1), " - ", round(zmax,1), ")") ), # 自定义图例样式 guide = guide_colorbar( title = "数值区间", frame.colour = "black", ticks = FALSE ) ) + coord_equal() + theme_minimal()
关键参数解释
colors:按顺序指定低区间纯色、中间过渡色板、高区间纯色。中间色板可以用任意连续色板(如viridis、RColorBrewer生成的颜色)。values:通过rescale()将数值断点转换为0-1的比例,告诉ggplot每个颜色对应的数值位置,从而实现区间分割。oob = squish:确保任何超出limits范围的值都被映射到边界颜色(如果数据中有超出low.val或zmax的情况,这一步会生效)。- 无需重分类数据:整个过程仅通过颜色映射逻辑实现区间渲染,原始栅格数据保持不变。
内容的提问来源于stack exchange,提问作者Francis van Oordt
相关产品推荐
相关产品推荐

