You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:35:21