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

R语言ggplot2中栅格的颜色类别与比例尺调整问题

解决方法:扩大调色板黄色区域以突出极值

你遇到的问题是因为scale_fill_whitebox_c是连续型颜色比例尺,其中的breaks参数仅用于控制坐标轴上的刻度显示,不会改变颜色映射的区间范围。要扩大黄色区域、突出极值,需要从调整颜色映射的逻辑入手,以下是几种可行方案:

方案1:使用变换函数压缩中间值

通过对数值做非线性变换,压缩中间值的颜色区间,自然扩大极值(两端)和黄色(中间)的占比。可以用内置变换函数,也可以自定义:

内置变换示例(如平方根变换)

# 先调整示例数据,让极值更明显
df$l <- c(-2, -0.5, 0.5, 3)
df_raster <- rasterFromXYZ(df) %>% terra::rast()

ggplot() + 
  geom_spatraster(data = df_raster) + 
  scale_fill_whitebox_c(palette = "bl_yl_rd", trans = "sqrt")

自定义变换(更精准控制)

使用scales包创建自定义变换,让中间小数值的区间被压缩,黄色区域覆盖更多范围:

library(scales)

# 定义变换:绝对值小于1的数做平方压缩,大于1的数保持原尺度
extreme_trans <- trans_new(
  "extreme",
  transform = function(x) sign(x) * ifelse(abs(x) < 1, abs(x)^2, abs(x)),
  inverse = function(x) sign(x) * ifelse(abs(x) < 1, sqrt(abs(x)), abs(x))
)

ggplot() + 
  geom_spatraster(data = df_raster) + 
  scale_fill_whitebox_c(palette = "bl_yl_rd", trans = extreme_trans)

方案2:自定义颜色映射断点

用scale_fill_gradientn手动指定颜色对应的数值断点,直接扩大黄色区域对应的数值范围:

# 提取bl_yl_rd调色板的颜色
yl_colors <- whitebox::whitebox_pal("bl_yl_rd")(10)

ggplot() + 
  geom_spatraster(data = df_raster) + 
  scale_fill_gradientn(
    colors = yl_colors,
    # 自定义数值断点:将0到1.5的范围映射为黄色区域(扩大中间区间)
    values = scales::rescale(c(-2, -1, 0, 1.5, 3))
  )

方案3:离散化颜色区间

如果允许将数据划分为离散区间,使用scale_fill_whitebox_b(离散型比例尺),通过手动设置breaks来让黄色区间覆盖更多数值:

ggplot() + 
  geom_spatraster(data = df_raster) + 
  scale_fill_whitebox_b(
    palette = "bl_yl_rd",
    # 自定义断点,让黄色对应0到1.5的范围
    breaks = c(-2, 0, 1.5, 3),
    labels = c("≤ -2", "-2 ~ 0", "0 ~ 1.5", "≥ 1.5")
  )

各方案适用场景

  • 方案1:适合需要保留连续颜色过渡的场景,无需手动划分区间。
  • 方案2:灵活性最高,可精准控制每个颜色对应的数值范围。
  • 方案3:适合需要明确区分区间的可视化场景,便于读者快速识别数值分组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:43:09