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

ggplot2直方图无法添加正态密度曲线及y轴边界调整求助

问题解决:ggplot2直方图添加正态曲线与Y轴边界调整

一、解决正态密度曲线不显示的问题

你的代码里直方图默认采用**计数(count)刻度,而stat_function生成的是密度(density)**值,两者量级差异极大,导致曲线要么被压缩到几乎看不见,要么完全在绘图区域外。有两种方案可以匹配两者的刻度:

方案1:将直方图转为密度刻度

给geom_histogram添加aes(y = ..density..),让直方图的Y轴和密度曲线统一为密度值:

library(ggplot2)

set.seed(1)
dat = data.frame(x = rnorm(1000))

ggplot(dat, aes(x = .data[['x']])) +
  geom_histogram(aes(y = ..density..), color = 'red', binwidth = 0.3) + # 新增密度映射
  stat_function(fun = function(x) dnorm(x, mean = mean(dat$x), sd = sd(dat$x))) + # 用数据自身的均值和标准差更准确
  scale_x_continuous(limits = c(-10, 10))

方案2:将密度曲线转为计数刻度

如果想保留直方图的计数刻度,需要把密度值转换为计数:计数 = 密度 × 样本量 × 组距(binwidth)。修改stat_function的fun参数:

library(ggplot2)

set.seed(1)
dat = data.frame(x = rnorm(1000))
n <- nrow(dat)
bin_width <- 0.3

ggplot(dat, aes(x = .data[['x']])) +
  geom_histogram(color = 'red', binwidth = bin_width) +
  stat_function(fun = function(x) dnorm(x, mean = mean(dat$x), sd = sd(dat$x)) * n * bin_width) + # 转换为计数刻度
  scale_x_continuous(limits = c(-10, 10))

二、解决Y轴边界问题:固定底部,顶部自适应

scale_y_continuous(expand = c(0, NA))未生效的原因是,expand是在数据原始范围基础上做扩展,而直方图的Y轴默认起始于0,此时该参数无法改变底部边界。要固定底部为0且顶部自适应,需要结合limits和expand参数:

scale_y_continuous(limits = c(0, NA), expand = c(0, 0.05))
  • limits = c(0, NA):强制Y轴从0开始,顶部自动匹配数据最大值
  • expand = c(0, 0.05):底部不扩展,顶部保留5%的留白(避免柱子顶到绘图边框)

如果不需要顶部留白,也可以设置expand = c(0, 0),但留一点留白会让图表更美观。

整合后的完整代码(以方案1为例)

library(ggplot2)

set.seed(1)
dat = data.frame(x = rnorm(1000))

ggplot(dat, aes(x = .data[['x']])) +
  geom_histogram(aes(y = ..density..), color = 'red', binwidth = 0.3, fill = "pink") + # 填充色让直方图更清晰
  stat_function(fun = function(x) dnorm(x, mean = mean(dat$x), sd = sd(dat$x)), color = "blue", size = 1) +
  scale_x_continuous(limits = c(-10, 10)) +
  scale_y_continuous(limits = c(0, NA), expand = c(0, 0.05)) +
  labs(title = "直方图与正态密度曲线", x = "X值", y = "密度")

内容的提问来源于stack exchange,提问作者Brian Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:40:08