如何使正态曲线匹配geom_histogram并保留百分比Y轴?
解决方案
要让正态曲线和直方图的Y轴统一为百分比,核心是把密度值转换为与直方图匹配的频数百分比,调整后的代码及说明如下:
library(ggplot2) library(scales) # 计算数据的均值、标准差和样本量,用于生成适配的正态曲线 data_stats <- data.frame( mean_val = mean(data$`left amplitude`, na.rm = TRUE), sd_val = sd(data$`left amplitude`, na.rm = TRUE), total_n = nrow(data) ) # 生成正态曲线的坐标数据(Y轴为百分比) norm_curve <- data.frame( x = seq(min(data$`left amplitude`, na.rm = TRUE), max(data$`left amplitude`, na.rm = TRUE), by = 0.01) ) %>% mutate( # 密度×组距=区间概率,乘以100转为百分比,和直方图刻度对齐 y = dnorm(x, mean = data_stats$mean_val, sd = data_stats$sd_val) * 0.1 * 100 ) ggplot(data, aes(`left amplitude`)) + # 直方图直接计算频数百分比,替代原来的密度值 stat_bin(aes(y = ..count../sum(..count..)*100), breaks = seq(min(data$`left amplitude`, na.rm = TRUE), max(data$`left amplitude`, na.rm = TRUE), by = 0.1), color = "white") + # 用预先计算的正态曲线数据绘制线条 geom_line(data = norm_curve, aes(x = x, y = y), size = 1) + # 确保Y轴百分比显示正确(比如0.2转为20%) scale_y_continuous(labels = percent_format(scale = 1), name = "percent") + theme_classic()
关键调整点:
- 直方图Y轴修正:将
y=..density..替换为y=..count../sum(..count..)*100,直接计算每组频数占总样本的百分比,与Y轴刻度完全匹配。 - 正态曲线适配:手动生成曲线数据,通过
dnorm得到密度后,乘以直方图的**组距(0.1)**再乘100,把密度值转换为百分比,让曲线高度和直方图对齐。 - 样式自定义:如果目标图的正态曲线是虚线,可在
geom_line中添加linetype = "dashed"参数调整。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

