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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:50:39