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

如何设置geom_sf填充色标 不剔除极值并为异常值单独配色

R空间多边形填充色极值干扰问题解决方案

这个问题不需要删除原始数据中的极值,通过scale_fill_*系列函数的参数配置即可完全实现需求,核心是锁定正常色标范围、单独给越界异常值分配独立颜色。

核心配置逻辑

  • 用limits参数强制将正常渐变的色标范围固定为需要的[-1, 2],避免被数千量级的极值拉宽色带、降低常规值区分度
  • 用oob = scales::squish参数设置越界值的处理规则:不删除越界的极值,将其暂时压缩到色标范围端点,用于匹配独立的异常值颜色
  • 用scale_fill_gradientn替代原本的scale_fill_gradient2,支持自定义多断点配色,专门给超出阈值的极值预留独立颜色位

问题示例

受异常值干扰的趋势图

可直接运行的修改后代码

library(tidyverse)
library(sf)
# 注:rgdal包已退役,建议后续用sf原生函数读取空间文件,不影响当前绘图逻辑
ggplot() + 
geom_sf(data=hydro_areas, colour="black", lwd=0.15) + # 水文分区边界
geom_sf(data=inla_results, aes(fill=rk.bsg.up), lwd=0.3, col="black") + # 待绘制趋势面
scale_fill_gradientn(
  name = "Trend",
  # 配色顺序:低于-1的低值异常 -> 正常区间低值蓝 -> 中点0白 -> 正常区间高值浅橙 -> 高于2的高值异常
  # 首尾的异常值颜色可按需自行替换
  colours = c("darkblue", "blue", "white", "orange", "#b2182b"),
  # 配色对应的数值断点,用scales::rescale标准化到0-1区间
  values = scales::rescale(c(-Inf, -1, 0, 2, Inf)),
  # 锁定正常色标范围
  limits = c(-1, 2),
  # 越界值不丢弃,压缩到端点匹配异常色
  oob = scales::squish,
  # 图例断点和标签,可明确标注异常值
  breaks = c(-1, 0, 1, 2),
  labels = c("-1", "0", "1", "≥2(异常高值)")
) +
xlab("Longitude") + ylab("Latitude") + theme_bw()

效果说明

  • 所有原始观测(包括极值)都会正常绘制,不会被过滤
  • 落在[-1, 2]正常区间的数值完全按照蓝-白-浅橙的渐变规则配色,区间内数值区分度不受极值影响
  • 超出阈值的异常值会使用设置的独立颜色展示,图例中也会明确标注异常区间
  • 如果不需要单独区分低于-1的低值异常,只需要把colours第一个颜色替换为和正常低值一致的"blue"即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:27:24