为何R中hist(X, freq=FALSE)与手动绘制的直方图Y轴不同?
直方图Y轴刻度差异的原因分析
你用hist(X, freq=FALSE)绘制的直方图,和手动用barplot模拟的图Y轴刻度存在差异,核心原因是两者计算的统计量定义完全不同:
hist(..., freq=FALSE)生成的是密度直方图:它计算的是概率密度,公式为:密度 = 组内频数 / (总样本量 × 组距)
这个定义保证所有矩形的面积之和为1,符合概率密度函数的核心性质。你的手动代码计算的是相对频数(频率):
freq_table / sum(freq_table)得到的是每组样本占总样本的比例,所有组的频率之和为1,但没有除以组距——因此数值上和密度差了「1/组距」的倍数(这里组距是0.5,所以密度是频率的2倍)。
修正后的手动实现代码
要让手动代码和hist(freq=FALSE)效果一致,只需将相对频数除以组距,得到概率密度:
set.seed(123) X <- rnorm(100) par(mfrow = c(1, 2)) # 原生hist密度直方图 hist(X, freq = FALSE, main = "", xlab = "", ylab = "") # 手动实现等效的密度直方图 breaks <- seq(-2.5, 2.5, by = 0.5) bin_width <- diff(breaks)[1] # 获取组距 freq_table <- table(cut(X, breaks = breaks, include.lowest = TRUE)) # 计算概率密度:相对频数 / 组距 density_values <- freq_table / (sum(freq_table) * bin_width) barplot(density_values, main = "", xlab = "", ylab = "", names.arg = names(freq_table))
运行这段代码后,两张图的Y轴刻度就会完全匹配,因为两者都基于概率密度进行绘制。
内容的提问来源于stack exchange,提问作者John Stone
相关产品推荐
相关产品推荐

