在R语言中为直方图添加正态(高斯)曲线失败求助
解决ggplot2直方图添加正态曲线的问题
你之前用curve()失败是因为它属于base R绘图系统,和ggplot2不兼容。下面用ggplot2的专用方法实现,分单变量和多变量两种场景:
前置准备
先加载所需包:
library(ggplot2) library(dplyr) library(tidyr) # 用于数据转格式
1. 单列数据(以ori_0为例)
核心是把直方图的y轴设为密度(density),让它和正态分布的密度值匹配,再用stat_function()添加曲线:
ggplot(exp_data, aes(x = ori_0)) + # 绘制直方图,y轴用密度 geom_histogram(aes(y = ..density..), bins = 30, fill = "lightblue", alpha = 0.7) + # 添加正态曲线,传入数据的均值和标准差 stat_function( fun = dnorm, args = list( mean = mean(exp_data$ori_0, na.rm = TRUE), sd = sd(exp_data$ori_0, na.rm = TRUE) ), color = "red", size = 1 ) + labs(title = "ori_0 直方图与正态曲线", x = "ori_0 数值", y = "密度")
2. 双列数据(ori_0和ori_90)
推荐先把宽格式数据转成长格式,再用分面展示,更清晰:
# 转成长格式:保留ori_0和ori_90,生成分组列和数值列 exp_data_long <- exp_data %>% select(ori_0, ori_90) %>% pivot_longer(cols = everything(), names_to = "分组", values_to = "数值") # 分面绘制每个变量的直方图+正态曲线 ggplot(exp_data_long, aes(x = 数值)) + geom_histogram(aes(y = ..density..), bins = 30, fill = "lightblue", alpha = 0.7) + stat_function( fun = dnorm, args = list( mean = mean(.$数值, na.rm = TRUE), sd = sd(.$数值, na.rm = TRUE) ), color = "red", size = 1 ) + facet_wrap(~分组, scales = "free") + # 分面,各面板尺度自适应 labs(title = "ori_0 与 ori_90 直方图与正态曲线", x = "数值", y = "密度")
如果需要在同一图中叠加两个变量的直方图和曲线(适合数值范围接近的情况):
ggplot() + # ori_0的直方图和曲线 geom_histogram(data = exp_data, aes(x = ori_0, y = ..density..), bins = 30, fill = "lightblue", alpha = 0.5) + stat_function(data = exp_data, fun = dnorm, args = list(mean = mean(exp_data$ori_0, na.rm = TRUE), sd = sd(exp_data$ori_0, na.rm = TRUE)), color = "blue", size = 1) + # ori_90的直方图和曲线 geom_histogram(data = exp_data, aes(x = ori_90, y = ..density..), bins = 30, fill = "pink", alpha = 0.5) + stat_function(data = exp_data, fun = dnorm, args = list(mean = mean(exp_data$ori_90, na.rm = TRUE), sd = sd(exp_data$ori_90, na.rm = TRUE)), color = "red", size = 1) + labs(title = "ori_0 与 ori_90 叠加直方图与正态曲线", x = "数值", y = "密度") + theme_bw()
关键注意点
- 必须设置直方图的
y = ..density..,否则默认的计数(count)尺度和正态曲线的密度尺度不匹配,曲线会出现偏移或缩放错误。 - 使用
na.rm = TRUE避免缺失值导致均值/标准差计算失败。
内容的提问来源于stack exchange,提问作者Cameron Renaud
相关产品推荐
相关产品推荐

