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
相关产品推荐
相关产品推荐

