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

在R语言中为直方图添加正态(高斯)曲线失败求助

解决ggplot2直方图添加正态曲线的问题

你之前用curve()失败是因为它属于base R绘图系统,和ggplot2不兼容。下面用ggplot2的专用方法实现,分单变量和多变量两种场景:

前置准备

先加载所需包:

library(ggplot2)
library(dplyr)
library(tidyr) # 用于数据转格式

1. 单列数据(以ori_0为例)

核心是把直方图的y轴设为密度(density),让它和正态分布的密度值匹配,再用stat_function()添加曲线:

ggplot(exp_data, aes(x = ori_0)) +
  # 绘制直方图,y轴用密度
  geom_histogram(aes(y = ..density..), bins = 30, fill = "lightblue", alpha = 0.7) +
  # 添加正态曲线,传入数据的均值和标准差
  stat_function(
    fun = dnorm,
    args = list(
      mean = mean(exp_data$ori_0, na.rm = TRUE),
      sd = sd(exp_data$ori_0, na.rm = TRUE)
    ),
    color = "red", size = 1
  ) +
  labs(title = "ori_0 直方图与正态曲线", x = "ori_0 数值", y = "密度")

2. 双列数据(ori_0和ori_90)

推荐先把宽格式数据转成长格式,再用分面展示,更清晰:

# 转成长格式:保留ori_0和ori_90,生成分组列和数值列
exp_data_long <- exp_data %>%
  select(ori_0, ori_90) %>%
  pivot_longer(cols = everything(), names_to = "分组", values_to = "数值")

# 分面绘制每个变量的直方图+正态曲线
ggplot(exp_data_long, aes(x = 数值)) +
  geom_histogram(aes(y = ..density..), bins = 30, fill = "lightblue", alpha = 0.7) +
  stat_function(
    fun = dnorm,
    args = list(
      mean = mean(.$数值, na.rm = TRUE),
      sd = sd(.$数值, na.rm = TRUE)
    ),
    color = "red", size = 1
  ) +
  facet_wrap(~分组, scales = "free") + # 分面,各面板尺度自适应
  labs(title = "ori_0 与 ori_90 直方图与正态曲线", x = "数值", y = "密度")

如果需要在同一图中叠加两个变量的直方图和曲线(适合数值范围接近的情况):

ggplot() +
  # ori_0的直方图和曲线
  geom_histogram(data = exp_data, aes(x = ori_0, y = ..density..), 
                 bins = 30, fill = "lightblue", alpha = 0.5) +
  stat_function(data = exp_data, fun = dnorm,
                args = list(mean = mean(exp_data$ori_0, na.rm = TRUE),
                            sd = sd(exp_data$ori_0, na.rm = TRUE)),
                color = "blue", size = 1) +
  # ori_90的直方图和曲线
  geom_histogram(data = exp_data, aes(x = ori_90, y = ..density..), 
                 bins = 30, fill = "pink", alpha = 0.5) +
  stat_function(data = exp_data, fun = dnorm,
                args = list(mean = mean(exp_data$ori_90, na.rm = TRUE),
                            sd = sd(exp_data$ori_90, na.rm = TRUE)),
                color = "red", size = 1) +
  labs(title = "ori_0 与 ori_90 叠加直方图与正态曲线", x = "数值", y = "密度") +
  theme_bw()

关键注意点

  • 必须设置直方图的y = ..density..,否则默认的计数(count)尺度和正态曲线的密度尺度不匹配,曲线会出现偏移或缩放错误。
  • 使用na.rm = TRUE避免缺失值导致均值/标准差计算失败。

内容的提问来源于stack exchange,提问作者Cameron Renaud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:25:26