如何在R的levelplot/lattice中调整绘图配色为蓝红白渐变?
用levelplot实现正负值分色(蓝/红)、0值附近白色的气候地图
问题描述
我用R的levelplot绘制全球气候数据地图,想把默认配色改成:正值用蓝色系、负值用红色系、0及附近用白色。现有绘图代码,但不确定levelplot是否支持这种调整,ggplot里倒是很容易实现,求方法。
现有代码:#packages installed library(raster) library(ncdf4) library(maps) library(maptools) library(rasterVis) library(ggplot2) library(rgdal) library(sp) library(gridExtra) library(grid) library(RColorBrewer) #Using levelplot FPlot10 <- levelplot(FDifference5,margin=F,at=c(seq(-50,150,10)),pretty=TRUE, par.settings=mapTheme, main="Higher end") FM10 <- FPlot10 + latticeExtra::layer(sp.lines(world.outlines.sp))
解决方案
levelplot完全支持这种自定义配色方案,核心是通过构建分段颜色向量,配合at参数的断点精准对应正负值和0附近的区间。
1. 构建自定义配色向量
先匹配你代码里的断点seq(-50,150,10),分别生成红色系(负值)、白色(0附近)、蓝色系(正值)的颜色:
# 定义断点(和原代码一致) breaks <- seq(-50, 150, 10) # 生成各区间颜色: # 负值区间(-50到-10):红色系(深→浅,对应绝对值大→小的负值) red_pal <- rev(RColorBrewer::brewer.pal(5, "Reds")) # 0附近区间(-10到10):白色,对应两个断点间隔(-10→0、0→10) white_pal <- rep("white", 2) # 正值区间(10到150):蓝色系(浅→深,对应值小→大) blue_pal <- RColorBrewer::brewer.pal(15, "Blues") # 合并所有颜色成完整配色向量 custom_pal <- c(red_pal, white_pal, blue_pal)
2. 在levelplot中应用配色
将自定义配色通过col.regions参数传入,确保at参数和配色区间数量匹配:
# 调整后的levelplot代码 FPlot10 <- levelplot(FDifference5, margin = FALSE, at = breaks, col.regions = custom_pal, # 关键:应用自定义配色 pretty = TRUE, par.settings = mapTheme, main = "Higher end") FM10 <- FPlot10 + latticeExtra::layer(sp.lines(world.outlines.sp))
3. 细节优化
- 如果需要调整0附近白色区间的宽度,修改
breaks即可。比如想让白色对应-5到5,断点改成c(seq(-50,-5,5), seq(-5,5,1), seq(5,150,5)),同时对应调整white_pal的长度(比如rep("white",10)对应10个小间隔)。 - 若不想用Brewer配色,可使用
colorRampPalette自定义渐变,比如:red_ramp <- colorRampPalette(c("darkred", "lightcoral"))(5) blue_ramp <- colorRampPalette(c("lightblue", "navy"))(15)
内容的提问来源于stack exchange,提问作者Android17
相关产品推荐
相关产品推荐

