Base R中叠加正态密度曲线至直方图失效问题求助
问题原因与解决方法
核心原因
问题出在直方图纵轴刻度与密度曲线的数值范围不匹配:
- Base R的
hist()默认参数freq=TRUE,纵轴显示的是样本频数(每个区间内的样本数量),1000个样本的直方图纵轴最大值通常在200左右。 - 而
density()和dnorm()输出的是概率密度值,标准正态分布的密度最大值仅约0.4,远小于频数的数量级,因此曲线会被压缩成几乎水平的直线。
解决方法
方法1:让直方图纵轴匹配密度刻度(推荐)
绘制直方图时设置freq=FALSE,将纵轴切换为概率密度,让密度曲线与直方图完美对齐:
set.seed(100) data <- rnorm(1000, mean = 0, sd = 1) # 绘制密度直方图 hist(data, main = "Normal Distribution", xlab = "X", ylab = "Density", col = "444", xlim = c(-4,4), freq = FALSE) # 叠加核密度估计曲线 lines(density(data), col = "red", lwd = 2) # 叠加理论正态密度曲线(可选) x <- seq(-4, 4, length.out = 100) lines(x, dnorm(x, mean = 0, sd = 1), col = "blue", lwd = 2, lty = 2)
方法2:将密度值转换为频数刻度
如果需要保留频数纵轴,可将密度值乘以样本量和直方图组距,转换为频数范围的数值:
set.seed(100) data <- rnorm(1000, mean = 0, sd = 1) # 绘制频数直方图并保存直方图对象 h <- hist(data, main = "Normal Distribution", xlab = "X", ylab = "Frequency", col = "444", xlim = c(-4,4)) # 获取直方图的组距 bin_width <- diff(h$breaks)[1] # 转换并叠加核密度曲线 lines(density(data)$x, density(data)$y * length(data) * bin_width, col = "red", lwd = 2) # 转换并叠加理论正态曲线(可选) x <- seq(-4, 4, length.out = 100) lines(x, dnorm(x, mean = 0, sd = 1) * length(data) * bin_width, col = "blue", lwd = 2, lty = 2)
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

