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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:56:36