R中ggplot2绘制直方图时如何缩放正态分布曲线(n=30)
解决直方图与正态分布曲线缩放不匹配的问题
你遇到的核心问题是:ggplot默认的直方图y轴是观测计数,而dnorm()输出的是概率密度(积分总和为1),两者数值量级差异极大,导致曲线被压得几乎看不见。下面提供两种可行的解决方式:
方法1:将直方图转为密度刻度(推荐)
直接把直方图的y轴切换为概率密度,和正态分布的密度输出对齐,无需额外缩放曲线:
library(ggplot2) n <- 30 set.seed(42) X <- rnorm(n, mean = 0, sd = 1) X <- as.data.frame(X) ggplot(X, aes(x = X)) + geom_histogram(aes(y = ..density..), bins = 6, fill = "lightblue", alpha = 0.7) + stat_function(fun = dnorm, args = list(mean = 0, sd = 1), color = "red", linewidth = 1)
解释:aes(y = ..density..)会将直方图的高度转换为概率密度,此时直方图的总面积为1,和dnorm()的输出逻辑完全一致,曲线自然就能和直方图匹配。
方法2:保留计数y轴,手动缩放正态曲线
如果需要保留直方图的计数刻度,需要将正态分布的密度值乘以样本量n × 组距(每个区间的预期计数 = 样本量 × 概率密度 × 组距):
library(ggplot2) n <- 30 set.seed(42) X <- rnorm(n, mean = 0, sd = 1) X <- as.data.frame(X) # 计算直方图的组距 bin_width <- diff(range(X$X)) / 6 ggplot(X, aes(x = X)) + geom_histogram(bins = 6, fill = "lightblue", alpha = 0.7) + stat_function( fun = function(x) dnorm(x, mean = 0, sd = 1) * n * bin_width, color = "red", linewidth = 1 )
解释:先根据数据范围和指定的bin数量算出组距,再用n * bin_width作为缩放系数,把概率密度转换为预期的计数数值,让曲线高度和直方图的计数刻度匹配。
内容的提问来源于stack exchange,提问作者Forklift17
相关产品推荐
相关产品推荐

