如何绘制均值ECDF并填充其与上下置信区间ECDF间的区域?
解决方案:绘制均值ECDF并填充置信区间ECDF区域
要实现仅展示均值的ECDF曲线,并填充上下置信区间ECDF之间的区域,需要先手动计算三条曲线的ECDF数据,再通过插值对齐x轴点,最后用geom_ribbon实现填充。具体步骤如下:
1. 加载依赖包与准备数据
library(tidyverse) # 示例数据 mean <- c(-0.3378003, 0.7254329, 0.6568026, -0.1529680, 0.2809831, -0.5420649, 0.7665903, -0.1624082, 0.9636990, 0.5978777) se <- c(0.1,0.04,0.01,0.01,0.01,0.06,0.09,0.12,0.05,0.02) df <- tibble(nodeId =1:10, mean_val = mean, up= mean+se, low = mean-se )
2. 编写ECDF计算函数
自定义函数计算单个变量的ECDF数据,返回排序后的变量值(x)和对应的累积概率(y):
compute_ecdf <- function(vec) { sorted_vec <- sort(vec) tibble( x = sorted_vec, y = seq_along(sorted_vec) / length(sorted_vec) ) } # 计算均值、置信区间上下限的ECDF数据 ecdf_mean <- compute_ecdf(df$mean_val) ecdf_up <- compute_ecdf(df$up) ecdf_low <- compute_ecdf(df$low)
3. 插值对齐ECDF的x轴点
由于三条ECDF的x轴点是各自变量的排序值,无法直接填充区域,因此需要将所有x值合并排序,再对上下限的ECDF进行插值,确保每个x点都有对应的累积概率:
# 收集所有唯一x值并排序 all_x <- sort(unique(c(ecdf_mean$x, ecdf_up$x, ecdf_low$x))) # 对上下限ECDF进行阶梯式插值(匹配ECDF的右连续特性) interp_ecdf <- function(ecdf_data, target_x) { approx(ecdf_data$x, ecdf_data$y, xout = target_x, method = "constant", f = 0)$y } y_low <- interp_ecdf(ecdf_low, all_x) y_up <- interp_ecdf(ecdf_up, all_x) # 构建填充区域的数据框 ribbon_data <- tibble( x = all_x, ymin = y_low, ymax = y_up )
4. 绘制最终图形
用geom_ribbon填充上下ECDF之间的区域,再用geom_step绘制均值的ECDF曲线:
ggplot() + # 填充置信区间ECDF区域(浅蓝色半透明) geom_ribbon(data = ribbon_data, aes(x = x, ymin = ymin, ymax = ymax), fill = "lightblue", alpha = 0.3) + # 绘制均值ECDF曲线(深蓝色粗线) geom_step(data = ecdf_mean, aes(x = x, y = y), color = "darkblue", linewidth = 1) + # 添加标签与主题 labs(x = "数值", y = "累积分布函数(ECDF)", title = "均值的ECDF曲线及置信区间带") + theme_minimal()
关键说明
- 插值时使用
method = "constant", f = 0是为了保留ECDF的阶梯状特性(右连续),避免平滑处理破坏原始分布形态。 geom_ribbon的alpha参数控制填充区域的透明度,可根据需求调整。
内容的提问来源于stack exchange,提问作者Betty
相关产品推荐
相关产品推荐

