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

R Base环境下绘制0值为白色的连续调色板栅格图的实现方法

解决方案

方法1:基于raster包原生plot函数实现

核心逻辑是按照实际值域中负区间和正区间的占比分配色阶,确保0值固定对应白色,完全不受正负值范围不对称的影响:

# 承接你的测试代码,先计算栅格极值
min_val <- cellStats(r, "min")
max_val <- cellStats(r, "max")

# 定义色阶总数量,数值越大渐变越平滑
n_color <- 200
# 计算0值在整个值域区间的位置占比
zero_ratio <- (0 - min_val) / (max_val - min_val)

# 分别生成红→白、白→蓝的渐变序列
pal_neg <- colorRampPalette(c("red", "white"))(round(n_color * zero_ratio))
pal_pos <- colorRampPalette(c("white", "blue"))(round(n_color * (1 - zero_ratio)))
# 合并去重,避免白色重复出现
custom_pal <- unique(c(pal_neg, pal_pos))

# 绘图时调用自定义调色板
plot(r, col = custom_pal)

方法2:基于ggplot2实现(可调性更强)

直接用scale_fill_gradient2内置的三向渐变功能,指定midpoint = 0即可自动适配不对称的数值分布,不需要手动计算色阶比例:

library(ggplot2)

# 将栅格转换为ggplot可用的数据框格式
r_df <- as.data.frame(r, xy = TRUE)
colnames(r_df)[3] <- "value"

ggplot() +
  geom_raster(data = r_df, aes(x = x, y = y, fill = value)) +
  # 直接指定三向渐变的锚点值和对应颜色
  scale_fill_gradient2(
    low = "red",
    mid = "white",
    high = "blue",
    midpoint = 0
  ) +
  labs(x = "", y = "", fill = "数值") +
  theme_minimal()

两种方法都可完美适配你给出的非对称测试数据(最小值-2000、最大值499),0值始终对应白色。


内容的提问来源于stack exchange,提问作者Mauricio Abel Herrera Díaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:54:08