如何用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
相关产品推荐
相关产品推荐

