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

如何使正态曲线匹配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:10:35