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

如何用ggplot2绘制仅含均值和标准差的正态分布并高亮重叠区域

使用ggplot2绘制XLIV类别的正态分布并高亮2σ重叠区域

数据集

x <- structure(list(FIGURE = c("4", "4", "4", "4", "XXXIIIc", "XXXIIIc", 
"XXXIIIc", "XXXVI", "XXXVI", "XXXVI", "XLIV", "XLIV", "XLIV", 
"3", "3", "88", "88", "19", "19", "19", "19", "19", "18a", "18a", 
"18a", "18b", "18c", "18c", "18c", "18c", "18c", "55", "Ensemble IX", 
"2", "25", "25", "26", "26", "29", "54", "54", "130", "130"), 
media_fecha = c(16382.5, 14759, 13776, 15941, 18189.5, 17546.5, 
17422, 18084, 16898.5, 17987, 16422.5, 15729.5, 17615.5, 
16016, 15864.5, 14643, 14132, 17146.5, 16619.5, 16424, 16317, 
16328.5, 16317, 15679, 14834.5, 15467, 13197.5, 12691.5, 
12683.5, 12384, 14545, 16053.5, 16669.5, 15234.5, 17036.5, 
16608, 17428, 17439.5, 26785.5, 16813, 16651.5, 15432, 14655
), sd_fecha = c(266.25, 235.5, 131.5, 327.5, 210.25, 267.75, 
267, 262, 239.25, 304, 283.75, 189.75, 266.75, 174, 294.75, 
278.5, 331, 266.75, 204.75, 215.5, 196, 285.25, 196, 288.5, 
250.25, 277, 63.75, 101.75, 100.75, 168, 337.5, 136.25, 212.75, 
183.25, 199.25, 206.5, 193, 264.75, 312.25, 235.5, 299.25, 
238.5, 312.5)), row.names = c(NA, -43L), class = c("tbl_df", 
"tbl", "data.frame"))

数据集说明

该数据集包含3列:

  • FIGURE:分类变量
  • media_fecha:每行数据的均值
  • sd_fecha:每行数据的标准差

其中FIGURE中的XLIV类别包含3行数据,需绘制这3行对应的正态分布,并高亮所有密度函数在2σ范围内的重叠区域。

实现步骤与代码

1. 提取XLIV类别的数据

先筛选出目标类别的数据:

library(tidyverse)
x_xliv <- x %>% filter(FIGURE == "XLIV")

2. 生成正态分布的密度数据

生成覆盖所有2σ区间的x值,并计算每个分布的密度:

# 确定x轴范围:覆盖所有分布的(均值-2σ)到(均值+2σ)
x_min <- min(x_xliv$media_fecha - 2*x_xliv$sd_fecha)
x_max <- max(x_xliv$media_fecha + 2*x_xliv$sd_fecha)
x_vals <- seq(x_min, x_max, length.out = 1000)

# 生成每个分布的密度数据框
dist_data <- map_dfr(1:nrow(x_xliv), function(i) {
  mu <- x_xliv$media_fecha[i]
  sigma <- x_xliv$sd_fecha[i]
  tibble(
    x = x_vals,
    density = dnorm(x_vals, mean = mu, sd = sigma),
    group = paste0("XLIV_", i)
  )
})

3. 计算重叠区域的密度边界

重叠区域的上边界是每个x点处所有密度的最小值:

overlap_data <- dist_data %>%
  group_by(x) %>%
  summarise(min_density = min(density)) %>%
  ungroup()

4. 使用ggplot2绘图

绘制曲线并填充重叠区域:

library(ggplot2)

ggplot() +
  # 填充重叠区域
  geom_area(data = overlap_data, aes(x = x, y = min_density), fill = "#66CCFF", alpha = 0.5) +
  # 绘制三条正态分布曲线
  geom_line(data = dist_data, aes(x = x, y = density, color = group), linewidth = 1) +
  # 可选:添加2σ区间的虚线标注
  geom_vline(data = x_xliv, aes(xintercept = media_fecha - 2*sd_fecha), linetype = "dashed", color = "gray") +
  geom_vline(data = x_xliv, aes(xintercept = media_fecha + 2*sd_fecha), linetype = "dashed", color = "gray") +
  # 设置标签与主题
  labs(
    x = "Fecha",
    y = "Densidad",
    title = "Distribuciones Normales de XLIV con Región de Solapamiento (2σ)",
    color = "Grupo XLIV"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

代码说明

  • 先提取目标类别数据,确保只处理XLIV的3行记录。
  • 生成覆盖所有2σ区间的x值,保证曲线完整显示。
  • 计算每个x点的最小密度,以此作为重叠区域的上边界,用geom_area填充。
  • 可选的虚线标注能直观展示每个分布的2σ范围,辅助判断重叠区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:15:45