R实现垂直深度剖面温度均值线及95%置信带绘制
0-500m深度温度1米分箱均值线+95%置信带R实现方案
核心逻辑完全匹配需求:按固定深度间隔分箱做统计,不使用曲线拟合,从根源上避免loess过拟合问题,可真实保留表层30m近恒温的特征。
前置依赖
需要加载两个常用R包,提前安装即可:
library(dplyr) library(ggplot2)
假设你的原始观测数据为数据框格式,包含两列:
depth:数值型,观测点深度,单位为m,范围覆盖0-500mtemperature:数值型,对应深度的实测温度值
步骤1:1米间隔分箱统计
按每1m深度为一个分箱,计算每个分箱内的温度均值、标准差、样本量、95%置信区间上下限:
temp_stat <- raw_data %>% # 生成1m间隔分箱标签,0对应0-1m层,1对应1-2m层,以此类推 mutate(depth_bin = floor(depth)) %>% # 过滤超出0-500m范围的异常值 filter(depth_bin >= 0, depth_bin <= 500) %>% # 按分箱分组统计 group_by(depth_bin) %>% summarise( temp_mean = mean(temperature, na.rm = TRUE), temp_sd = sd(temperature, na.rm = TRUE), obs_count = n(), # 基于t分布计算95%置信区间,小样本下比1.96*标准误的计算方式更准确 ci_low = temp_mean - qt(0.975, df = obs_count - 1) * temp_sd / sqrt(obs_count), ci_high = temp_mean + qt(0.975, df = obs_count - 1) * temp_sd / sqrt(obs_count), .groups = "drop" )
注意:如果个别1m分箱内有效样本量不足2,标准差会返回NA,对应位置的置信带会出现断档。如果观测数据密度较低,可以把分箱间隔调整为2m或5m,只需把分箱生成代码替换为
mutate(depth_bin = floor(depth/2)*2)(2m间隔)或mutate(depth_bin = floor(depth/5)*5)(5m间隔)即可。
步骤2:绘制均值线+95%置信带
深度图默认反转Y轴,让表层(0m)在图的上方,符合常规读图习惯:
ggplot(temp_stat, aes(x = temp_mean, y = depth_bin)) + # 先绘制95%置信带,设置半透明填充 geom_ribbon(aes(xmin = ci_low, xmax = ci_high), fill = "#2171b5", alpha = 0.3) + # 再绘制均值折线 geom_path(color = "#08306b", linewidth = 1) + # 反转Y轴,设置刻度间隔 scale_y_reverse(limits = c(500, 0), breaks = seq(0, 500, 50)) + labs( x = "温度 (°C)", y = "深度 (m)", title = "0-500m水体剖面温度分布" ) + theme_bw()
方案说明
- 所有结果完全基于实测数据分箱聚合,无拟合算法引入的偏差,表层30m若为恒温层,均值线会自然呈现平直段,不会出现过拟合导致的虚假波动
- 置信带宽度会自动反映每个深度层的观测离散度:观测越密集、数据越一致的层位,置信带越窄
- 若需要叠加原始散点,只需在绘图代码中加一层
geom_point(data = raw_data, aes(x = temperature, y = depth), size = 0.5, alpha = 0.2, color = "gray50")即可,记得把散点图层放在最底层。
内容的提问来源于stack exchange,提问作者Chris A. Ora
相关产品推荐
相关产品推荐

