You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中用ggplot2绘制带95%置信区间的多组对比密度图

核心调整思路

你当前的代码仅支持单组密度的区间绘制,要实现多组对比,需要做两处修改:

  1. 在ggplot的美学映射中添加分组变量,关联你的时间区间列,生成多组独立的密度曲线
  2. 改造区间绘制函数,支持匹配多组密度数据与对应分组的95%置信区间边界

完整实现代码

首先统一变量约定:

  • 长表ex_long包含3列:val为观测值,period为时间区间分组列,每一行对应一条观测
  • 置信区间表tab包含3列:period(与长表分组一一对应)、q2.5(2.5%分位下限)、q97.5(97.5%分位上限)
library(magrittr)
library(ggplot2)
library(dplyr)
library(purrr)

# 改造后的多组置信区间绘制函数
plot_multi_credi <- function(gg_density, ci_tab) {
  # 提取所有分组的密度计算结果
  build_obj <- ggplot_build(gg_density)
  dens_data <- build_obj$data[[1]]
  # 按分组拆分密度数据
  dens_list <- split(dens_data, dens_data$group)
  # 遍历每个分组,生成对应区间的填充图层
  area_layers <- imap(dens_list, function(d, g) {
    # 匹配当前分组对应的置信区间
    group_ci <- ci_tab[as.integer(g), ]
    left <- group_ci$q2.5
    right <- group_ci$q97.5
    # 筛选区间内的密度点
    idx_left <- min(which(d$x >= left))
    idx_right <- max(which(d$x <= right))
    area_df <- data.frame(
      x = d$x[idx_left:idx_right],
      y = d$y[idx_left:idx_right],
      period = group_ci$period
    )
    geom_area(data = area_df, aes(x = x, y = y, fill = period), alpha = 0.4, inherit.aes = FALSE)
  })
  # 叠加所有图层返回
  gg_density + area_layers
}

# 生成基础多组密度图
gg_density <- ggplot(ex_long, aes(x = val, color = period)) + 
  geom_density(linewidth = 1) +
  labs(x = "观测值", y = "密度", color = "时间区间", fill = "时间区间")

# 叠加所有分组的95%置信区间填充
final_plot <- gg_density %>% plot_multi_credi(tab)
print(final_plot)

可选优化

如果分组较多重叠严重,可添加分面逻辑,在基础图中加入facet_wrap(~period)即可实现每个分组单独占用一个子图的效果,同时保持坐标范围一致方便对比。

内容的提问来源于stack exchange,提问作者noob_researcher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:06:08