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
相关产品推荐
相关产品推荐

