在R中用ggplot绘制高分辨率.nc卫星叶绿素数据并添加色条
卫星叶绿素数据绘图优化方案
问题背景
绘制指定坐标区域的卫星叶绿素数据时,当前结果存在分辨率极低(大块像素)、色条不显示的问题;同时因数据梯度极小(0.01-0.5单位),需采用对数尺度绘图。
针对性解决方案
1. 提升分辨率:数据平滑/插值处理
原始数据像素块大源于MODIS数据本身分辨率限制,可通过双线性插值重采样快速提升视觉分辨率,操作简单且效果直观;若数据缺失值较多,也可改用克里金插值进行外推填充。
2. 对数尺度适配
保留log(chl + 1)的对数转换方式,但需匹配色条刻度与实际数据范围(数据经clamp后为0.01-0.5,对应对数范围约0.01~0.405),避免刻度超出数据范围导致显示异常。
3. 修复色条不显示问题
原代码中guides参数位置错误,需将title.position等配置放入guide_colorbar内部;同时确保scale_fill_gradientn的刻度贴合实际对数范围,且图层顺序正确(栅图层在底,国界层在上)。
修改后完整代码
require(oceanmap) require(raster) require(ncdf4) require(tidyverse) library(sf) library(ggplot2) library(rnaturalearth) library(rnaturalearthdata) library(oce) # 导入oce包用于颜色条 # 加载国界数据 world <- ne_countries(scale = "medium", returnclass = "sf") # 读取并裁剪叶绿素数据 chl.a <- raster("~/Downloads/file_chl_satellite.nc", varname = "chl") rufiji.extent <- extent(-21.75, -13, 24, 29) chl.a <- crop(chl.a, rufiji.extent) # 过滤数据范围 chl.a <- clamp(chl.a, upper = 0.5, lower = 0.01, usevalues = FALSE) # 双线性插值提升分辨率:将原分辨率缩小10倍(可按需调整) high_res_template <- raster(rufiji.extent, res = res(chl.a)/10) chl.a_smoothed <- resample(chl.a, high_res_template, method = "bilinear") # 转换为数据框并计算对数 chl.a.tb <- chl.a_smoothed %>% as.data.frame(xy = TRUE) %>% as_tibble() %>% rename(lon = 1, lat = 2, chl = 3) %>% mutate(chl_log = log(chl + 1)) # 对数尺度绘图+修复色条 ggplot() + geom_raster(data = chl.a.tb, aes(x = lon, y = lat, fill = chl_log)) + geom_sf(data = world, fill = "grey80", col = "black", size = 0.3) + coord_sf(xlim = c(-21, -13), ylim = c(24.2, 28.5), expand = FALSE) + scale_fill_gradientn( colours = oce.colorsJet(120), na.value = "white", breaks = seq(0, 0.45, 0.05), # 匹配实际对数范围 labels = function(x) round(exp(x)-1, 2), # 对数刻度转回原始叶绿素值,便于解读 name = expression(log(Chlorophyll[a] + 1)) ) + guides( fill = guide_colorbar( title.position = "right", title.theme = element_text(angle = 90), barwidth = unit(.5, "cm"), barheight = unit(7.5, "cm"), title.hjust = .5 ) ) + theme_bw() + theme( legend.position = "right", panel.grid = element_blank() )
关键说明
- 插值分辨率:
res = res(chl.a)/10表示分辨率提升10倍,数值越小分辨率越高,可根据计算性能调整; - 色条标签:通过
exp(x)-1将对数刻度转回原始叶绿素值,降低解读门槛; - 图层顺序:
geom_raster需放在geom_sf之前,避免国界被栅格图层覆盖。
内容的提问来源于stack exchange,提问作者Ecg
相关产品推荐
相关产品推荐

